2012-02-29 3 views
6

Nella mia applicazione basata su Spring, attualmente ho ruoli di base come ADMIN e USER.Impostazione dei ruoli utente in base a un tipo di proprietà in Spring Security

È possibile definire un ruolo utente come PHOTO_UPLOADER, che eredita da USER, ma aggiunge anche un controllo se l'utente che effettua la chiamata è effettivamente il proprietario della foto?

Sono stanco di scrivere lo stesso if (currentUser.id == photo.uploader.id) nelle azioni del mio controller più e più volte. Si applica anche ad altre entità.

risposta

0

Benvenuto nel mondo di ACLs - elenco di controllo di accesso. Il tutorial This è piuttosto vecchio ma piuttosto completo.

+0

Beh, era vecchio nel 2012, quindi ora nel 2017 immagino sia "super vecchio". C'è qualcosa di nuovo negli ACL in primavera? È ancora difficile iniziare con questo - o esiste già un'alternativa? – displayname

9

È possibile gestirlo con ACL come suggerito da Tomasz Nurkiewicz. Ma gli ACL di Spring Securitz sono complessi e scarsamente documentati. (La migliore risorsa che conosco perché è questo libro: Spring Security 3 - per di Primavera di sicurezza degli autori)

Ma se si ha realmente bisogno solo questo semplice test if (currentUser.id == photo.uploader.id), allora mi sento di raccomandare un altra tecnica.

È possibile migliorare le espressioni di sicurezza del metodo che è possibile utilizzare nelle annotazioni @PreAuthorize. Come:

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

Per attuare tale espressione isPhotoOwner il nucleo è molto semplice:

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 c'è qualche lavoro supplementare per registrare l'ExtendedMethodSecurityExpressionRoot. --- Non ho tempo in questo momento, se si è disposti a provare questo approccio, quindi lasciare un commment, e io descripe il resto

+1

Mi piace quello – preslavrachev

1

non so quali tipi di dati di accesso di tecnologia si è utilizzando. so che puoi scrivere interceptor o listener di eventi per fare il controllo di sicurezza per l'ibernazione. penso che anche ibatis sia allo stesso modo. nel mio progetto, ho scritto i metodi di interfaccia di abilitazione CRUD nel modello genitore/classe entità, e ho fatto il controllo di sicurezza in alcuni eventi, come prima del caricamento delle entità. spring security acl è un po 'complesso. implementare la tua soluzione di sicurezza è molto meglio.