2014-10-24 2 views
11

Spring Security ACL sembra molto potente e facile da implementare quando si può restare fedeli all'implementazione del proprio database. Tuttavia sembra diventare molto più complicato quando devi implementare il tuo Acl e AclService (vedi ad esempio questo (vecchio) very basic tutorial di solo ~ 26 pagine) e sembra difficile trovare riferimenti ed esempi per questo (quel tutorial era del 2008).Quando devo implementare l'ACL Spring Security nella mia applicazione?

Nella nostra applicazione, ad esempio, gli utenti hanno ruoli e appartengono ai reparti. La maggior parte delle volte, sono autorizzati a eseguire alcune operazioni su oggetti che appartengono al loro dipartimento in base ai loro ruoli. In tutti i casi, dipartimento + ruolo è sufficiente per decidere se a un utente debba essere concessa un'operazione specifica su un oggetto specifico.

Utenti, ruoli e reparti sono gestiti da un'applicazione esterna da cui li recuperiamo quando l'utente si connette (stiamo utilizzando i servizi REST ma potrebbe anche essere un server LDAP).

Ci piacerebbe fare affidamento su @PreAuthorize('hasPermission(…)') per l'implementazione della sicurezza degli oggetti di dominio. 2 soluzioni sono quindi in vista:

  1. Implementare una personalizzata PermissionEvaluator che esegue i controlli completi; oppure
  2. Implementare ACL con un valore personalizzato AclService che costruisce la struttura dell'oggetto necessaria affinché gli ACL funzionino correttamente.

Sembra che l'attuazione dell'intero AclService sarebbe più difficile e più complesso di attuazione di un PermissionEvaluator, ma ACL sembrano essere più standard.

In base a quali criteri è necessario implementare l'uno o l'altro?

risposta

13

Il PermissionEvaluator è responsabile della valutazione dell'espressione per determinare se un utente ha un'autorizzazione per un determinato oggetto di dominio. D'altra parte il AclService fornisce un'interfaccia per il recupero delle istanze Acl. Nello spirito di Separation of concerns ogni componente risponde a un problema separato.

Se qualsiasi implementazione PermissionEvaluator deve eseguire la valutazione in base alle istanze Acl, è necessario delegare a AclService per recuperarle. In realtà AclPermissionEvaluator fa esattamente questo.

Ti suggerisco di andare in questo modo. Valutazione separata dal recupero ACL. Se il concetto di Spring AclService e Acl è troppo complicato o complesso per il tuo caso d'uso, puoi introdurre il tuo servizio per recuperare ACL personalizzato. Quindi implementare PermissionEvaluator che verrà delegato al servizio ACL.

In realtà, dovevo fare qualcosa di simile perché avevo bisogno di archiviare gli ACL nel database NoSQL e ciò che Spring non funzionava per me.

Direi che si tratta dello sforzo necessario per adattare l'ACL di primavera alle proprie esigenze e allo sforzo di implementare una soluzione personalizzata. Se i tuoi requisiti possono essere soddisfatti dall'implementazione predefinita di Spring ACL, prova. Ti farà sicuramente risparmiare tempo per implementare la tua soluzione personalizzata. Tuttavia, se non è possibile adattare Spring ACL alle proprie esigenze o sarebbe troppo difficile, allora può essere più semplice implementare la soluzione personalizzata.

+1

Grazie per la risposta.In realtà la mia domanda era più nel senso: quando ha senso e quando vale la pena implementare l'implementazione della sicurezza della tua applicazione in Spring Security ACL? –

+0

Vedere la risposta aggiornata. Speriamo che possa essere d'aiuto. – pgiecek