2010-02-09 19 views
11

Quiero administrar usuarios y roles en una aplicación dedicada. Por ejemplo, un usuario de esta aplicación ("jefe de customerX") puede crear un nuevo rol "empleado de customerX". Si un empleado accede al servidor de aplicaciones Java EE (GlassFish 3), debe obtener el rol de "empleado de customerX".roles dinámicos en un servidor Java EE

Parece simple, pero no es compatible con Java EE, porque los grupos se asignan a roles en el momento de la puesta en marcha y los roles dentro de la aplicación son estáticos.

¿Cuál es la mejor manera de administrar roles de usuario en tiempo de ejecución en un entorno Java EE (6)?

+2

He creado https://java.net/jira/browse/JAVAEE_SPEC-20 en apoyo de (entre otros) este caso de uso. Si usted o alguien más todavía está molesto por la falta de dinamismo en los roles de Java EE, vótelo o deje un comentario. –

Respuesta

11

La seguridad declarativa en Java EE no es adecuada para tales requisitos. El problema de la seguridad se puede dividir en dos:

  • autenticación
  • autorización

tuve requisito similar una vez. Usamos la autenticación integrada para tener el conjunto principal y luego confiamos en los mecanismos de inicio de sesión predeterminados de Java EE. Pero terminamos administrando la parte de autorización manualmente en el nivel de aplicación.

De hecho, incluso los papeles que se cargarán y asociados con el director (isUserInRole para la web y isCallerInRole para el EJB) necesita ser especificado en web.xml o ejb.xml que no proporciona suficiente flexibilidad. Tuvimos que cargar los roles manualmente (según el principal) desde LDAP o ActiveDirectory. Luego usamos los interceptores EJB3 y el filtro Servlet para realizar los controles de seguridad nosotros mismos.

Sin embargo, recomiendo encarecidamente que se apegue a un control de acceso basado en roles (RBAC) y no implemente algo más elegante. Existen varios marcos que pueden ayudar a tratar el RBAC casero.

También echamos un vistazo a JSecurity y Acegi Security y parecían interesantes.

+0

Gracias por su respuesta, especialmente por la sugerencia de que incluso los roles dinámicamente establecidos deben declararse estáticamente en web.xml o ejb.xml. Esa habría sido la próxima trampa para mí. Comprobaré JSecurity y Spring Security (el sucesor de Acegi) http://static.springsource.org/spring-security/site/index.html. – deamon

+1

JSecurity ahora se llama "Shiro". http://cwiki.apache.org/confluence/display/SHIRO/Index – deamon

+0

Sí, los roles declarados con '' o '@ DeclaredRoles' son en realidad nombres simbólicos que deberían asignarse al rol en el directorio externo (por ejemplo, LDAP) usando ''. Si el mapeo es 1-a-1, Glassfish tiene una opción "principal por defecto para el mapeo de roles", pero eso es solo la mitad de la solución y usted todavía debe listar el papel en alguna parte. – ewernli