Pasé todo el día buscando en Google y mirando varias preguntas aquí, tratando de encontrar la mejor solución para implementar autenticación y autorización. He encontrado una parte de la solución ahora, pero espero que alguien pueda llenar los vacíos. Soy consciente de que hay una gran cantidad de texto a continuación, pero por favor tengan paciencia conmigo: O)JSF: Autenticación y autorización, la mejor forma de hacerlo
Antecedentes
He heredado una parte completada la aplicación CRM que actualmente utiliza JSF 2.0, JavaEE 6, JPA y PostgreSQL base de datos. Desafortunadamente, los tipos que originalmente comenzaron a construir esta aplicación web en su sabiduría infinita decidieron que sería mejor dejar la autenticación/autorización hasta el final. Ahora tengo que ponerlo.
La aplicación se divide esencialmente en tres capas: las vistas, los beans gestionados y los DAO. Esto significa que los beans administrados son particularmente "gordos" ya que contienen toda la lógica de lógica de negocios, validación y navegación.
requisitos de autenticación/autorización
- autenticación basada en formularios, validando contra credenciales almacenadas en la base de datos PostgreSQL.
- La única página que será públicamente accesible (por usuarios anónimos) será la página de inicio de sesión.
- Necesito evitar el acceso a ciertas áreas de la aplicación en función del rol de los usuarios. Por ejemplo, solo los usuarios con la función 'Admin' deberían poder acceder a la página de creación/edición del usuario.
- También necesito poder restringir el acceso a ciertas áreas de una página. Por ejemplo, un usuario con el rol 'Representante de ventas' debería poder ver los detalles de un cliente, pero el botón Guardar/editar solo debería mostrarse si el usuario tiene el rol 'Servicio al cliente'.
¿Dónde estoy en
La primera cosa que planeo hacer es seguir este ejemplo User Authentication and Authorization using JAAS and Servlet 3.0 Login. Esto creo que cumplirá mis primeros 3 requisitos.
Para mostrar/ocultar los botones de guardar, etc. en las páginas, puedo usar la técnica descrita en this SO answer. Esto resolverá en parte el requisito 4, sin embargo, creo que todavía necesito asegurar los métodos de acción yo los beans administrados. Por ejemplo, me gustaría poder agregar una anotación o algo al método save() en el bean del cliente para asegurar que solo los usuarios con el rol de 'Servicio al cliente' puedan llamarlo, aquí es donde empiezo a tener problemas .
Supongo que una opción sería hacer algo similar a lo que propongo hacer en la vista y usar facesContext para verificar si el usuario actual "está en función". No estoy interesado en esto, ya que solo complicará mi código y preferiría usar anotaciones en su lugar. Si hiciera esta ruta, ¿cómo devolvería un estado http 403?
Las anotaciones javax.annotation.security. * Parecen ser una buena opción para definir declaritivamente el acceso a las áreas de la aplicación, pero, por lo que tengo entendido, solo se pueden agregar a las EJB. Esto significaría que tendría que mover toda mi lógica comercial de los beans administrados donde reside actualmente a los nuevos EJB. Creo que esto tendría el beneficio adicional de separar la lógica comercial en su propio conjunto de clases (delegados, servicios o lo que sea que elija llamarlos).Sin embargo, este sería un refactor bastante grande que no se verá favorecido por la falta de pruebas unitarias o pruebas de integración. No estoy seguro de si la responsabilidad del control de acceso debe ser en este nuevo nivel de servicio tampoco, creo que debería estar en los beans administrados.
Otras alternativas
Durante mi investigación he encontrado mucha gente que citan marcos como la primavera y de la costura. Tengo una experiencia limitada con Seam, creo que hubiera sido una buena opción para este proyecto y, por lo que recuerdo, creo que resuelve los problemas de autorización que estoy teniendo, pero creo que es demasiado tarde para presentarlo ahora. .
También he visto a Shiro mencionar en varios lugares. Después de mirar el 10 minute tutorial, me pareció una buena opción, especialmente en combinación con Deluan Quintao's taglib, pero no he podido encontrar tutoriales ni ejemplos de cómo integrarlo con una aplicación web JSF.
La otra alternativa con la que me he encontrado sorprendentemente habitual es la implementación de una solución personalizada: ¡esto me parece una locura!
Resumen
En resumen, realmente me gustaría alguna orientación acerca de si yo estoy dirigiendo por el camino correcto en cuanto a la implementación de la autenticación y la autorización y cómo rellenar la pieza que falta del individuo asegurar métodos y/o beans gestionados (o al menos el código que delegar a) y/o la forma en que puede volver manualmente un estado HTTP 403.
> No he podido encontrar ningún tutorial o ejemplos de cómo integrarlo con una aplicación web JSF. - Hay uno ahora, pero aún no es ideal: http://balusc.blogspot.com/2013/01/apache-shiro-is-it-ready-for-java-ee-6.html –