2011-09-20 8 views
11

Attualmente sto integrando la sicurezza delle molle nel nostro nuovo stack di applicazioni Web. Dovremo essere in grado di concedere autorizzazioni per un utente o un ruolo per accedere a un oggetto specifico oa tutti gli oggetti di un certo tipo. Tuttavia questa è una cosa che non ho capito quando lavoro attraverso documentazioni ed esempi:spring-security come ACL concede le autorizzazioni

Un ACL concede le autorizzazioni solo a un utente/ruolo per un singolo oggetto o lo fa per l'intero tipo? A quanto ho capito, domain object indica il tipo, ma gli esempi e le esercitazioni sembrano assegnare autorizzazioni a oggetti specifici. Sono solo confuso o posso fare entrambe le cose? Se no, come faccio l'altro?

Grazie!

risposta

24

Con la sicurezza della molla puoi fare entrambe le cose. È possibile perché la sicurezza di primavera supporta le cosiddette regole di autorizzazione: all'interno della terminologia di sicurezza di primavera, le chiamano valutatori di autorizzazioni . Le regole di autorizzazione comprendono ACL, ma è anche possibile proteggere le istanze degli oggetti quando si trovano in un determinato stato ... ecc.

Questo è come funziona:

  1. È necessario estendere il PermissionEvaluator - questo consente di avere logica personalizzata eccellente per la determinazione dei diritti di accesso - è possibile controllare il tipo di oggetto o di verificare la presenza di un particolare id, o controllare se l'utente richiamando il metodo è l'utente che ha creato l'oggetto, ecc .:

    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. Ora che avete una regola di sicurezza, è necessario applicare attraverso le annotazioni:

    @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. Affinché questo per lavorare le annotazioni di sicurezza dovrebbero essere abilitato nel 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, grazie per la risposta rapida, non pensavo che sarebbe così facile da implementare il PermissionEvaluator guardando all'implementazione 'AclPermissionEvaluator' dove usano una sorta di' ObjectIdentityRetrievalStrategy' ... – Pete

+0

Puoi avere sia l'evidenziazione di elenchi che di codice, aggiungi solo quattro spazi extra. Ho modificato questo post come esempio, vedi la fonte. :) –

+0

Vedo ora. Molte grazie! –

Problemi correlati