Eu quero gerenciar usuário e funções em um aplicativo dedicado. Por exemplo, um usuário deste aplicativo (“customerX boss”) pode criar uma nova function “employeeX employee”. Se um funcionário acessa o servidor de aplicativos Java EE (GlassFish 3), ele deve obter a function “employeeX employee”.
Parece simples, mas não é suportado pelo Java EE, porque os grupos são mapeados para funções no momento da boot e as funções dentro do aplicativo são estáticas.
Qual é a melhor maneira de gerenciar funções de usuário em tempo de execução em um ambiente Java EE (6)?
A segurança declarativa no Java EE não é realmente adequada para tais requisitos. O problema da segurança pode ser dividido em dois:
Eu tive uma exigência semelhante uma vez. Usamos a autenticação integrada para definir o principal e confiamos nos mecanismos de login padrão do Java EE. Mas acabamos gerenciando a parte de autorização manualmente no nível do aplicativo.
De fato, até mesmo as funções que serão carregadas e associadas ao principal ( isUserInRole
para a Web e isCallerInRole
para o EJB) precisam ser especificadas em web.xml
ou ejb.xml
que não oferece flexibilidade suficiente. Tínhamos então que carregar as funções manualmente (de acordo com o principal) do LDAP ou ActiveDirectory. Em seguida, usamos os interceptores EJB3 e o filtro Servlet para executar as verificações de segurança por nós mesmos.
No entanto, sugiro enfaticamente manter um controle de access baseado em function (RBAC) e não implementar algo mais sofisticado. Existem várias estruturas que podem ajudar a lidar com o RBAC caseiro.
Nós também vimos o JSecurity e o Acegi Security e eles pareciam interessantes.