2009-12-17 16 views
6

Desidero utilizzare Spring Security per gestire utenti, gruppi e autorizzazioni.Group and acl on Spring Security

Desidero utilizzare ACL per proteggere i miei oggetti di dominio ma non riesco a trovare un modo per assegnare un gruppo a un ACL.

Ad esempio: Ho utenti e gruppi. Ogni gruppo può avere i seguenti titoli: - gestire i forum (può essere un ruolo come ROLE_FORUM_MANAGER) - modificare un forum specifico (acl sul forum specifico).

Inoltre, i gruppi sono definiti dagli utenti che hanno il ruolo ROLE_PERMISSION_MANAGER. MA tutti i gruppi definiti da questo utente possono essere modificati e gestiti solo da questo utente. Quindi il gruppo è collegato a un utente. Esattamente, immagina che l'utente crei un gruppo google: questo utente può gestire i gruppi di permessi giusti solo per il gruppo che ha creato. E così può creare un gruppo per gestire forum specifici del proprio gruppo google.

Come posso farlo?

Ho letto la documentazione di sicurezza a molla e le seguenti esercitazioni (quindi per favore non mandatemi a questi collegamenti): http://grzegorzborkowski.blogspot.com/2008/10/spring-security-acl-very-basic-tutorial.html http://blog.denksoft.com/?page_id=20

risposta

14

Controllare Spring Security 3.0, è possibile evitare l'uso di ACL utilizzando il linguaggio di espressione Spring.

Per esempio, per la modifica di un forum, si dovrebbe avere un metodo fissato come questo:

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

Si potrebbe quindi implementare il metodo hasPermission in un valutatore un'autorizzazione personalizzata, come:

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 
    } 
} 

Infine, collegalo insieme nella configurazione dell'applicazione:

<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ì, l'ho già visto, ma siccome spring security 3 non è una versione ufficiale, non lo userei, ma penso che aspetterò un po 'per usarlo. –

+0

Per fare ciò usando argomenti come "#forum" devi avere informazioni di debug lasciate nei tuoi JAR di produzione ... probabilmente non è una buona idea. – HDave

+0

Nel bean wire-up, l'ultimo elemento dovrebbe essere 'ForumPermissionEvaluator' piuttosto che' GroupPermissionEvaluator'? Un'altra domanda: se si voleva avere più di un PermissionEvaluator, come sarebbe cablato, dal momento che esiste un solo expressionHandler? –

1

ho fatto qualcosa di simile 'manualmente': vale a dire che ho avuto il mio codice di determinare quali istanze potrebbero essere modificate/cancellate da un utente specifico e si sono basate esclusivamente sulla sicurezza di Spring per assicurarsi che abbiano il ruolo giusto per accedere alla funzionalità e per fornire informazioni di ruolo/autenticazione per l'utente corrente.

Quindi nel mio codice ho determinato il principio corrente (la nostra classe utente) e in base a ciò ho deciso quali diritti questo utente aveva su un'istanza specifica.

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

Ma non capisco come si applica un acl a un gruppo nel tuo caso? –

+0

In realtà non uso un acl, ma il gruppo e l'utente sono entrambi entità e hanno una relazione (bidirezionale) (gestita da ibernazione). Per determinare se l'utente può eseguire azioni speciali su un gruppo, controlla se l'attuale principale è un moderatore di quel gruppo (cioè il gruppo è contenuto nella raccolta "moderati" dell'utente). Quindi la lista dei moderatori di ogni gruppo è fondamentalmente la 'ACL' per quel gruppo e che è gestita nel database, non nella configurazione di sicurezza di primavera. –

2

Vorrei solo usare i tuoi gruppi come ruoli. Ho trovato che l'implementazione dell'ACL di primavera è piuttosto ingombrante e per la maggior parte inutilizzabile. Assegnare semplicemente gli utenti a "gruppi" (ruoli in tutte le realtà) e controllarli come si farebbe con le normali autorizzazioni basate sui ruoli.

+0

Così posso creare dinamicamente un'autorità come "GROUP_15" e dopo di essa, aggiungere al forum 75 l'acl con GrantedAuthoritySid ("GROUP_15"). Se posso farlo, va bene per me. Ma ho bisogno di creare tutti i ruoli e le autorizzazioni in modo dinamico. –

+0

Si potrebbe fare ciò, ma non con le Annotazioni di primavera, almeno fuori dalla scatola. Il "RUOLO" che usi nell'annotazione è hardcoded e non dinamico. Suggerirei di scrivere il proprio MethodInterceptor e andare da loro - è un'interfaccia semplice e non richiede molto codice. – Gandalf