¿Cómo manejar la autenticación / autorización con usuarios en una base de datos?

Actualmente, estoy trabajando en un proyecto web usando JSF 2.0, Tomcat 7 y MongoDB. Tengo una gran pregunta sobre cómo manejar la gestión de sesión y la autenticación / autorización con usuarios en una base de datos.

La estructura que quiero es la siguiente: solo los usuarios que inician sesión pueden crear eventos y todos pueden ver los eventos creados.

  • create.xhtml -> solo para usuarios con sesión iniciada.
  • events.xhtml -> público para todos.

La estructura básica que estoy planeando es:

  • Compruebe si la página requiere usuario conectado (por ejemplo, create.xhtml )
  • En caso afirmativo, compruebe si el usuario ha iniciado sesión
  • Si el usuario no ha iniciado sesión, vaya a login.xhtml
  • Si ha iniciado sesión correctamente, regrese a la página solicitada
  • Mantenga la información “El usuario ha iniciado sesión” a menos que el usuario haga clic en el botón de cerrar sesión. (Creo que @SessionScoped entra en juego)

La pregunta es:

  1. ¿Cuál es la forma menos complicada de hacer esto?
  2. ¿Dónde debería usar la anotación @SessionScoped ? En Create.java o LoginManager.java ?
  3. La seguridad de spring parece algo complicada para mi problema, ¿realmente lo necesito? En caso afirmativo, ¿puede explicarnos un poco cómo funciona la implementación junto con JSF 2.0 y Mongo DB?

Hay varias opciones. Cuál elegir es totalmente tu decisión. Simplemente sopese las ventajas y desventajas concretas conforme a su propia situación.


1. Usar autenticación administrada por contenedor proporcionada por Java EE

Simplemente declare una en web.xml que se refiere a un dominio de seguridad que está configurado en servletcontainer. Para su aplicación web, puede especificar los patrones de URL que deben verificarse para el inicio de sesión y / o función (es), por ejemplo /secured/* , /app/* , /private/* , etc.

Antes de Java EE 8, desafortunadamente aún necesita configurar una seguridad real de una manera específica de servlet. Por lo general, se describe en la documentación específica del servletconainer. En el caso de Tomcat 8, ese es el CÓMO REALIZAR el Reino . Por ejemplo, un dominio basado en la base de datos basado en tablas de usuarios / roles se describe en la sección “JDBCRealm”.

Desde Java EE 8, finalmente habrá una API estándar basada en JSR-375 .

Ventajas:

  • Relativamente rápido y fácil de configurar y usar.
  • Desde Java EE 8 finalmente hay una API estándar robusta y flexible.

Desventajas:

  • Antes de Java EE 8, la configuración del reino es específica del contenedor. En Java EE 8, la nueva especificación de seguridad JSR-375 debería resolver eso con la ayuda de JASPIC .
  • Antes de Java EE 8, no hay un control detallado.
  • Antes de Java EE 8, es muy espartano; sin “recordarme”, mal manejo de errores, sin restricciones basadas en permisos.

Ver también:

  • Realización de autenticación de usuario en Java EE / JSF utilizando j_security_check – contiene ejemplos completos de código
  • Aplicación de lanzamiento de Java EE: aplicación web de ejemplo (desarrollada por mí) que también demuestra la autenticación de Java EE 8 con Soteria (el JSR-375 RI).

2. Homegrow un filtro servlet

Esto permite un control mucho más detallado, pero necesitará escribir todo el código usted mismo y realmente debería saber / entender cómo debe implementar dicho filtro para evitar potenciales agujeros de seguridad. En el lado JSF, podría, por ejemplo, simplemente poner el usuario conectado como un atributo de sesión por sessionMap.put("user", user) y verificar el filtro si session.getAttribute("user") no es null .

Ventajas:

  • Control de grano fino.
  • Completamente contenedor independiente.

Desventajas:

  • Reinvención de la rueda; las nuevas funciones requieren mucho código.
  • Como iniciador, nunca está seguro de si su código es 100% robusto.

Ver también:

  • ¿Hay alguna manera fácil de preprocesar y redirigir las solicitudes GET? – contiene una explicación introductoria y un ejemplo de kickoff para la autenticación
  • La redirección de autorización en la caducidad de la sesión no funciona al enviar un formulario JSF, la página sigue siendo la misma : contiene un ejemplo más prolongado de inicio de sesión para la autenticación, que también cubre las solicitudes ajax
  • JSF: ¿cómo controlar el acceso y los derechos en JSF? – contiene el ejemplo kickoff para la autorización

3. Adaptar un marco de terceros

Por ejemplo, Apache Shiro , Spring Security , etc. Esto ofrece opciones de configuración mucho más finas que la autenticación estándar administrada por contenedor y no es necesario que escriba ningún código para esto, espere de la página de inicio de sesión y alguna configuración (XML) por supuesto.

Ventajas:

  • Control de grano fino.
  • Completamente contenedor independiente.
  • No reinvención de la rueda; mínimo de código propio.
  • Completamente desarrollado y probado por la gran cantidad de usuarios, lo más probable es que sea 100% robusto.

Desventajas:

  • Alguna curva de aprendizaje

Ver también:

  • JSF2 – Tutorial Shiro – un extenso tutorial sobre la integración de Shiro en la aplicación web JSF2