2009-12-17 957 views
6

Quiero usar Spring Security para administrar usuarios, grupos y permisos.Group and acl en Spring Security

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 están definidos por 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?

He leído la documentación de seguridad de resorte y los siguientes tutoriales (así que por favor no me enviar a estos enlaces): http://grzegorzborkowski.blogspot.com/2008/10/spring-security-acl-very-basic-tutorial.html http://blog.denksoft.com/?page_id=20

Respuesta

14

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

Por ejemplo, para editar un foro, que tendría un método asegurado de esta manera:

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

A continuación, poner en práctica 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, conecte el cableado 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" /> 
+0

sí, lo he visto antes, pero como spring security 3 no es un lanzamiento oficial, no lo usaría, pero creo que esperaré un poco para usarlo. –

+0

Para hacer esto usando argumentos de métodos como "#forum", debe tener información de depuración en sus JAR de producción ... probablemente no sea una buena idea. – HDave

+0

En el cableado de bean, ¿el último elemento debería ser 'ForumPermissionEvaluator' en lugar de' GroupPermissionEvaluator'? Otra pregunta: si quisiera tener más de un PermissionEvaluator, ¿cómo se cablearía eso, ya que solo hay un expresionHandler? –

1

hice algo similar 'manualmente': es decir, tuve mi propio código para determinar qué instancias podrían ser editadas/eliminadas por un usuario específico y solo se basó en la seguridad de Spring para garantizar que tenían la función correcta de acceder a la funcionalidad y proporcionar información de rol/autenticación para el usuario actual.

Así que 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; 
} 
+0

Pero no entiendo cómo se aplica un acl a un grupo en tu caso? –

+0

Realmente no uso un acl, pero el grupo y el usuario son entidades y tienen una relación (bidireccional) (administrada por hibernación). Para determinar si el usuario puede realizar acciones especiales en un grupo, verifico si el principal actual es un moderador de ese grupo (es decir, el grupo está contenido en la colección 'moderada' del usuario). Así que la lista de moderadores de cada grupo es básicamente la 'ACL' para ese grupo y que se gestiona en la base de datos, no en la configuración de seguridad de primavera. –

2

Me limitaré a utilizar 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.

+0

Así puedo crear dinámicamente una autoridad como "GROUP_15" y después de eso, agregar al foro 75 el acl con GrantedAuthoritySid ("GROUP_15"). Si puedo hacer eso, es bueno para mí. Pero necesito crear todos los roles y permisos dinámicamente. –

+0

Puede hacerlo, pero no con las anotaciones de primavera, al menos de fábrica. El "ROL" que usas en la anotación está codificado y no es dinámico. Sugeriría que escribas tu propio MethodInterceptor y que vayas desde su - es una interfaz simple y no requiere mucho código. – Gandalf