Estou tentando criar uma estrutura ACL flexível em Java para o meu aplicativo.
Muitas estruturas da ACL são criadas em uma lista de permissões, onde uma regra está na forma de owner: action: resource . Por exemplo,
- "JOHN pode visualizar o recurso FOOBAR-1"
- "MARY pode visualizar o recurso FOOBAR-1"
- "MARY pode editar o recurso FOOBAR-1"
Isso é atraente porque as regras podem ser facilmente serializadas / persistidas em um banco de dados. Mas meu aplicativo tem lógica de negócios complexa. Por exemplo,
- "Todos os usuários do departamento 1 com mais de 5 anos de antiguidade podem VISUALIZAR o recurso FOOBAR-1, caso contrário não estão autorizados"
- "Todos os usuários do departamento 2, se a data for posterior a 15/03/2016, podem VER o recurso FOOBAR-2, caso contrário não autorizado"
Pensando bem, seria um pesadelo conceber um esquema de banco de dados que pudesse lidar com regras infinitamente complexas como essas. Portanto, parece que eu precisaria "inseri-los" no aplicativo compilado, avaliá-los para cada usuário e, em seguida, produzir regras owner: action: resource como resultado da avaliação. Eu quero evitar inserir a lógica no aplicativo compilado.
Então, eu estava pensando em representar uma regra na forma de predicado : action: resource , em que o predicado é uma expressão booleana que determina se um usuário é permitido. O predicado seria uma string de uma expressão JavaScript que poderia ser avaliada pelo mecanismo Rhino do Java. Por exemplo,
return user.getDept() == 1 && user.seniority > 5;
Ao fazer isso, os predicados podem ser facilmente persistidos no banco de dados.
Isso é inteligente ? Isso é desleixado ? Isso é enigmático ? Isso é excesso de engenharia ? Isso é seguro (aparentemente, o Java pode proteger o mecanismo Rhino).