2011-09-20 9 views
11

estoy integrando actualmente resortes de seguridad en nuestra nueva pila de aplicaciones web. Tendremos que ser capaz de conceder permisos para un usuario o rol para acceder a un objeto específico o todos los objetos de un tipo determinado. Sin embargo, eso es una cosa que realmente no conseguí al trabajar con documentaciones y ejemplos:spring-security cómo ACL otorga permisos

¿Una ACL solo otorga permisos a un usuario/función para un solo objeto o lo hace para todo el tipo? Como yo lo entiendo, domain object significa el tipo, pero los ejemplos y tutoriales parecen que asignar permisos a objetos específicos. ¿Estoy confundido o puedo hacer las dos cosas? Si no, ¿cómo hago el otro?

Gracias!

Respuesta

24

Con la primavera-seguridad puede hacer ambas cosas. Es posible porque la primavera-seguridad es compatible con las llamadas reglas de permiso - dentro de la terminología de seguridad de resorte que lo llaman evaluadores de permisos. Las reglas de permiso abarcan ACL, pero también puede asegurar instancias de objetos cuando se encuentran en cierto estado ... etc.

Así es como funciona:

  1. Es necesario extender el PermissionEvaluator - esto le permite tener la lógica de encargo super para determinar los derechos de acceso - se puede comprobar el tipo de objeto o detectar la presencia de una determinada Identificación, o comprobar si el usuario que invoca el método es el usuario que creó el objeto, etc .:

    public class SomePermissionsEvaluator implements PermissionEvaluator { 
        @Override 
        public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) { 
         if (permission.equals("do_something") && 
         /*authentication authorities has the role A*/) { 
          return true 
         } else if (permission.equals("do_something_else") && 
         /*authentication authorities has the role B*/) { 
          return /*true if targetDomainObject satisfies certain condition*/; 
         } 
    
         return false; 
        } 
    
        @Override 
        public boolean hasPermission(Authentication authentication, 
         Serializable targetId, String targetType, Object permission) { 
        throw new UnsupportedOperationException(); 
        } 
    } 
    
  2. Ahora que tiene una regla de seguridad, es necesario aplicar a través de anotaciones:

    @PreAuthorize("hasRole('SOME_ROLE_OR_RIGHT') and" + 
    " hasPermission(#someDomainObject, 'do_something')") 
    public void updateSomeDomainObject(SomeDomainObject someDomainObject) { 
        // before updating the object spring-security will check the security rules 
    } 
    
  3. Para que esto funcione, las anotaciones de seguridad debe estar habilitado en el applicationContext.xml:

    <global-method-security secured-annotations="enabled" pre-post-annotations="enabled"> 
        <expression-handler ref="expressionHandler"/> 
    </global-method-security> 
    
    <beans:bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
        <beans:property name="permissionEvaluator"> 
         <beans:bean id="permissionEvaluator" class="com.npacemo.permissions.SomePermissionsEvaluator"/> 
        </beans:property> 
    </beans:bean> 
    
+0

Ah, gracias por la respuesta rápida, no pensaron que sería tan fácil de implementar la PermissionEvaluator mirando el 'aplicación AclPermissionEvaluator' donde utilizan algún tipo de' ObjectIdentityRetrievalStrategy' ... – Pete

+0

puede tener ambos lista y lo más destacado de código, sólo tiene que añadir cuatro espacios adicionales. Edité esta publicación como ejemplo, veo la fuente. :) –

+0

Ahora veo. ¡Muchas gracias! –