2012-02-29 8 views
6

En mi aplicación basada en Spring, actualmente tengo funciones básicas como ADMIN y USER.Establecimiento de roles de usuario basados ​​en algún tipo de propiedad en Spring Security

¿Es posible definir una función de usuario como PHOTO_UPLOADER, que hereda de USER, pero también agrega una comprobación de si el usuario que realiza la llamada es realmente el propietario de la foto?

Estoy cansado de escribir el mismo if (currentUser.id == photo.uploader.id) en mis acciones de controlador una y otra vez. Se aplica a otras entidades también.

Respuesta

0

Bienvenido en el mundo de ACLs - lista de control de acceso. This tutorial es bastante antiguo, pero bastante completo.

+0

Bueno, era viejo en 2012, así que ahora en 2017 supongo que es "muy viejo". ¿Hay algo nuevo en ACL en Spring? Todavía es difícil comenzar con eso, ¿o ya existe una alternativa? – displayname

9

Puede manejarlo con ACL como sugirió Tomasz Nurkiewicz. Pero las ACL de Spring Securitz son complejas y están mal documentadas. (El mejor recurso que conozco es este libro: Spring Security 3 - por los autores de Spring Security)

Pero si realmente solo necesitas esta simple prueba if (currentUser.id == photo.uploader.id), te recomendaría otra técnica.

Es posible mejorar las expresiones de seguridad del método, puede usarlas en las anotaciones @PreAuthorize. Al igual que:

@PreAuthorize("isPhotoOwner(#photo)") 
public void doSomething(final Photo photo) { 

Para poner en práctica tal expresión isPhotoOwner el núcleo es muy simple:

public class ExtendedMethodSecurityExpressionRoot extends MethodSecurityExpressionRoot { 

    public ExtendedMethodSecurityExpressionRoot(final Authentication a) { 
     super(a); 
    } 

    /** 
    * 
    */ 
    public boolean isPhotoOwner(final Photo photoObject) { 
     if (photoObject == null) { 
      return false; 
     } 

     Photo photo = (photo) photoObject; 
     return photo.getCreator().getLogin().equals(authentication.getName()); 
    } 
} 

Unfortunaly hay algo de trabajo a $ adicionales para registrar el ExtendedMethodSecurityExpressionRoot. --- No tengo tiempo en este momento, si está dispuesto a probar este enfoque, entonces deje un comentario, y voy a describir el resto

+1

Me gusta ese – preslavrachev

1

No sé qué tipo de tecnología de acceso a datos es usted utilizando. Sé que puedes escribir un interceptor o un oyente de eventos para hacer la comprobación de seguridad para hibernar. creo que ibatis también es de la misma manera. en mi proyecto, escribí los métodos de interfaz de habilitación de CRUD en la clase de entidad/modelo principal y realizo la comprobación de seguridad en algunos eventos, como antes de la carga de la entidad. spring security acl es un poco complejo. implementar su solución de seguridad es mucho mejor.

Cuestiones relacionadas