Pregunta

Estoy creando una aplicación web con control de acceso basado en roles utilizando la seguridad Acegi (Spring). Así que tengo diferentes usuarios con roles: ROLE_ADMIN , ROLE_USER y etc.
Sin embargo, necesito implementar varias restricciones de usuario.

Consideremos un ejemplo:

  

Supongamos que hay un sitio donde los usuarios pueden ver películas en línea. Hay usuarios con roles ROLE_STANDARD_USER y ROLE_VIP_USER . Los usuarios estándar pueden ver 3 películas a la semana y los usuarios de vip pueden ver 10 películas a la semana, además de tener otros privilegios. Y hay un usuario en el grupo de usuarios estándar a quien quiero dar 2 películas adicionales por semana. El número de películas permitidas a veces puede cambiar.
  Además, hay varias categorías de películas: fantasía, comedia, películas clásicas, nuevas, etc. Y quiero que algunos usuarios, independientemente de su función, tengan acceso solo a ciertas categorías. Las categorías se pueden crear y eliminar dinámicamente.

¿Existen prácticas estándar para implementar este tipo de restricciones de usuario?
¿Se puede / debe hacer usando los roles y permisos de Spring Security?
¿O debo considerar agregar un motor basado en reglas a mi aplicación?

Gracias.

Editar:
El ejemplo anterior es ficticio, mi proyecto se refiere a otorgar acceso remoto a varios equipos de red (y otros) para estudiantes. Sin embargo, es probable que los tipos de restricciones de usuario sean los mismos.
Desafortunadamente, el Modelo para el acceso de usuarios & amp; Las restricciones no son completas y estables. En un futuro próximo, se me podría indicar que implemente varias restricciones adicionales para los usuarios, que ahora no se conocen.
Así que me gustaría seleccionar una ruta ahora que facilite la adición o el cambio de nuevas restricciones de usuarios en el futuro y no requiera una revisión significativa del modelo interno o la estructura de la base de datos. Si eso es posible.

Editar 2

Actualmente, las restricciones básicas de los usuarios están codificadas (remanentes del sistema de creación de prototipos). Supongo que primero intentaré refactorizarlo con algún tipo de objetos de servicios empresariales parametrizados y luego pensar dónde puedo ir desde allí. También consideraré usar los administradores de decisiones de autorización de seguridad de Spring.

¡Gracias por todas las sugerencias!

¿Fue útil?

Solución

No esperaría que un sistema de seguridad declarativo basado en roles proporcione el control preciso que está buscando. Ya ha descrito bastantes "reglas de negocio" Los controles de acceso basados ??en que desea implementar y podemos esperar que con el tiempo esas reglas se vuelvan más complejas. Por lo tanto, necesita una combinación de información del subsistema de seguridad (¿quién es el usuario para esta solicitud? ¿Qué roles tienen?) Pero luego combínelo mediante programación con datos y reglas comerciales (este usuario tiene derecho a 2 películas gratis si es la fecha de hoy). está en este rango).

Como mínimo, definiría los servicios en los que encapsularé esa lógica de negocios. La decisión sobre si usar un motor de reglas de pleno derecho necesitaría más estudio.

Otros consejos

Antes de preguntarte, Acegi (o un motor de reglas, etc.) es el lugar correcto para hacerlo, creo que necesitas
analice sus necesidades de manera precisa y completa .

Teniendo en cuenta cada tema ( por ejemplo, los límites de la película que se pueden ver ), hay una gran cantidad de formas de implementar esto y usted debe tomar decisiones funcionales. No puede haber una implementación correcta a menos que ya hayas decidido en detalle qué se debe hacer.

Ejemplo de un modelo para sus necesidades:

  • Limite el número de películas en general por semana de acuerdo con la suma de :
    • rol (3 o 10)
    • bonificación por usuario (0 predeterminado si no se menciona)
  • Actualice estos números según sea necesario
  • Restrinja las películas a una lista de categorías:
    • si se especifica una lista para el usuario, utilícela
    • de lo contrario, use la lista que se proporciona para el rol

Este ejemplo tiene muchas implicaciones, que pueden ser correctas o inaceptables en su caso.
Implicaciones:

  • después de actualizar un número, el límite se cambia de inmediato.
  • no hay memoria de los límites semanales, no puede pedir esto por el pasado (para hacer estadísticas, por ejemplo)
  • ...

Suponiendo que este modelo no se adapta a sus necesidades, se enfrenta al arduo trabajo de crear un modelo que realmente se ajuste a ellas. Solo una vez que lo tengas, piensa en la implementación.

Si considera Spring Security, esta es una forma en la que veo que puede implementar su solución. Implementar un AccessDecisionVoter para decidir sobre el acceso del usuario. Eche un vistazo a la fuente de referencia aquí

También mire el [javadoc] [2] para AccessDecisionVoter . Puede implementar sus reglas implementando el método vote .

int vote(Authentication authentication,
         Object object,
         ConfigAttributeDefinition config)

Deje que Spring maneje el acceso (autenticación y autorización). Si la toma de decisiones se complica, utilice un motor de reglas. Deje que el método de votación llame a un motor de reglas. Esto proporciona una clara separación del deber. Permita que Spring Security maneje el acceso y que el motor de reglas calcule las reglas.

[2]: http://static.springsource.org/spring-security/site/apidocs/org/springframework/security/vote/AccessDecisionVoter.html#vote (org.springframework.security.Authentication , java.lang.Object, org.springframework.security.ConfigAttributeDefinition)

Parece que tiene necesidades de autenticación y de autorización, muchas veces las personas se confunden y / o se unen. Afortunadamente, Spring Security los delinea muy bien. Su usuario se autenticará a través de la cadena de seguridad (ya sea de logj, openID, SSL X509) y, una vez que lo haya hecho, será autorizado por los votantes específicos de su empresa (en su AccessDecisionManagers), ya sea que hayan visto o no su número asignado de peliculas. Si es necesario agregar una nueva lógica de negocios más adelante, es simplemente una cuestión de escribir nuevos / más votantes e inyectarlos en su Gerente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top