2015-08-14 37 views
7

Abbiamo un'app business di medie dimensioni e usiamo i ruoli e le autorizzazioni Spring Security (RBAC) pesantemente con un grande kludge per attivare e disattivare i ruoli per determinati casi più le regole nascoste in SpEL all'interno dei tag @PreAuthorize.Spring Security e ABAC (controllo dell'accesso basato sugli attributi)

Penso che cosa abbiamo effettivamente implementato (senza sapere che è ABAC). XACML sembra molto complicato e gonfio quindi non sono appassionato di qui la risposta:

How to change Spring Security roles by context?

Qualcuno ha fatto un'implementazione ABAC peso leggero senza XACML? Spero che questo ci consenta di separare le preoccupazioni dal momento che gli oggetti del dominio fanno semplicemente @PreAuthorize (WRITE) ecc. E la nostra politica di autorizzazione sarebbe disaccoppiata da esso.

Da quello che ho letto il principio di base di ABAC è molto semplice. Hai un'azione (molto simile a un permesso) e un meccanismo da risolvere se l'attuale Principal ha quell'autorizzazione su un determinato Soggetto.

Sono a conoscenza di AccessDecisionVoter che è approssimativamente il giusto tipo di interfaccia, ma non penso che fosse destinato al voto sulle autorizzazioni. Tuttavia, l'implementazione della nostra politica di autorizzazione con istanze di qualcosa del genere sembra molto interessante.

Ci scusiamo per la domanda sconclusionata! Fondamentalmente sono interessante in ABAC ma vorrei evitare la produzione casalinga ma preoccupato di cosa XACML sia un jumbo jet quando abbiamo bisogno di un Cessna.

+0

Cosa ti fa pensare che XACML sia una ruota del trattore? È semplice implementare –

+0

Esiste un'integrazione diretta tra Spring Security e XACML tramite il plug-in Axiomatics Spring –

+1

Ciao David, Guardare il sorgente XACML è molto prolisso e complesso. Ho giocato con le regole in Java, è semplice e abbiamo già questo set di abilità, è tempo di compilazione controllato ... Anche Axiomatics sembra essere l'unico lavoro realmente attivo su XACML. Posso immaginare che XACML/Axiomatics sarebbe un bene per una grande impresa, ma non siamo noi. Mi dispiace "la ruota del trattore" è stata giudicata male. Jumbo jet quando abbiamo bisogno di un Cessna? Modificherò la mia domanda. – salk31

risposta

9

Sembra che ci sia due cose si sono intesi per:

  1. autorizzazione esteriorizzato, in cui si desidera spostare le politiche di controllo di accesso di codice (o almeno in un posto centrale nel codice e non dispersi attraverso il codice di primavera) di autorizzazione basato
  2. attributo, in cui si desidera utilizzare gli attributi più ricchi di ruoli e autorizzazioni

io non sono molto sicuro di (2) da quello che dici che vuoi fare, l'azione " e un meccanismo da risolvere se il cu il principale ha il permesso ", è ancora, nei miei libri, RBAC. Avete altre condizioni sulle quali basare le decisioni di concessione di accesso? Posizione dell'utente, ora del giorno, valore di determinati dati in un database, proprietà della risorsa su cui si agisce ecc.? Se è così, andiamo nel mondo ABAC. Ad ogni modo, direi che RBAC è un sottoinsieme di ABAC poiché un ruolo è solo un attributo.

Ora, come per (1), lo schema generale dovrebbe innanzitutto centralizzare il motore di autorizzazione e utilizzare le annotazioni Spring per chiamare questo authz. motore per le decisioni di accesso. Hai due scelte:

  • authz incorporato. engine: dove una libreria implementa il motore e viene chiamata dal codice proprio come una funzione Java. Potrebbe essere un motore XACML o potrebbe essere la tua implementazione RBAC/ABAC
  • come servizio di rete: dove un servizio (micro) basato sulla rete risponde alle domande sulle decisioni di controllo degli accessi. Potrebbe essere un motore XACML o potrebbe essere la tua implementazione RBAC/ABAC

Al fine di ottenere il codice basato su Spring per chiamare questo authz. motore, un approccio sarebbe quello di scrivere il proprio elettore di sicurezza di primavera.Un altro modo, che ho trovato molto più semplice, sarebbe quello di scrivere le espressioni basate sul linguaggio di espressione di primavera che è possibile chiamare con l'esistente @PreAutorize, @PostAuthorize, @PreFilter e @PostFiler, sec: autorizzare i tag e anche da intercettare-url condizioni.

Questo è quello che ho usato quando ho lavorato sul nostro Spring Security XACML PEP SDK. L'approccio dovrebbe funzionare egregiamente anche se si decide di non utilizzare XACML per i criteri decisionali di accesso o la comunicazione richiesta/risposta.

+0

Molte grazie per la risposta dettagliata. Per cercare di spiegare perché penso che potrei aver bisogno di ABAC: Una regola è "se adminRole o (! This.submitted e! This.historic e ((this.confidential e powerRole) o (! This.confidential e inASetOfPeopleResponsibleForThisObject)) mi dispiace per pseudo codice e dominio oscuro Sono totalmente d'accordo sul fatto che una parte della soluzione sia RBAC ma abbiamo pochissimi ruoli "statici" rispetto a quelli che dipendono da una relazione con l'oggetto: – salk31

+1

Sì, ciò che descrivi sicuramente va oltre l'RBAC. pensa che l'approccio che ho menzionato sopra funzionerebbe ancora per te –

+0

Grazie a Srijith, se saresti così gentile un ultimo pezzetto di controllo mentale/mano in mano non c'è un motore ABAC open source che tu sappia? ragionevole scrivere il nostro semplice micro-framework? Ho messo insieme una dimostrazione di concetto ma questo è sempre un po 'facile;) – salk31