with management example custom authorities and spring spring-security acl roles

management - Grupo y acl en Spring Security



spring security with roles (3)

Quiero usar Spring Security para administrar usuarios, grupos y permisos.

Quiero usar ACL para proteger mis objetos de dominio, pero no puedo encontrar la manera de asignar un grupo a un acl.

Por ejemplo: tengo usuarios y grupos. Cada grupo puede tener los siguientes valores: - administrar foros (puede ser un rol como ROLE_FORUM_MANAGER ) - editar un foro específico (acl en el foro específico).

Además, los Grupos los definen los usuarios que tienen el rol ROLE_PERMISSION_MANAGER . PERO todos los grupos definidos por este usuario solo pueden ser editados y administrados por este usuario. Entonces el grupo está unido a un usuario. Exactamente, imagine que el usuario crea un grupo de google: este usuario puede administrar grupos de permisos correctos solo para el grupo que ha creado. Y así puede crear un grupo para administrar el foro específico de su propio grupo de google.

¿Cómo puedo hacerlo?

Leí los documentos de seguridad de primavera y los siguientes tutoriales (así que no me envíen a estos enlaces): http://grzegorzborkowski.blogspot.com/2008/10/spring-security-acl-very-basic-tutorial.html http://blog.denksoft.com/?page_id=20


Hice algo similar "manualmente": es decir, tenía mi propio código para determinar qué instancias podían ser editadas / eliminadas por un usuario específico y solo confiaba en la seguridad de Spring para garantizar que tenían el rol correcto de acceder a la funcionalidad y proporcionar rol / autenticación información para el usuario actual.

Entonces, en mi código, determiné el principal actual (nuestra propia clase de usuario) y en función de eso decidí qué derechos tenía este usuario en una instancia específica.

public static User getCurrentUser() { User user = null; Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null) { Object principal = auth.getPrincipal(); if (principal instanceof User) { user = (User)principal; } } return user; }


Solo usaría tus Grupos como Roles. Descubrí que la implementación de Spring ACL es bastante difícil de manejar y, en general, inservible. Simplemente asigne usuarios a "grupos" (Roles en toda realidad) y márquelos como lo haría con la autorización normal basada en roles.


Compruebe Spring Security 3.0, es posible que pueda evitar el uso de ACL usando el Lenguaje de expresión de Spring.

Por ejemplo, para editar un foro, tendría un método seguro como este:

@PreAuthorize("hasRole(''ROLE_FORUM_MANAGER'') and hasPermission(#forum,''update'')) public void updateForum(Forum forum) { //some implementation }

Luego, implementaría el método hasPermission en un evaluador de permisos personalizado, como:

public class ForumPermissionEvaluator implements PermissionEvaluator { public boolean hasPermission(Authentication authentication, Object domainObject, Object permission) { //implement } public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) { //implement } }

Finalmente, conéctelo en la configuración de la aplicación:

<beans:bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> <beans:property name="permissionEvaluator" ref="permissionEvaluator"/> </beans:bean> <beans:bean id="permissionEvaluator" class="com.centrix.core.security.GroupPermissionEvaluator" />