2012-05-08 10 views
6

Sto implementando il controllo degli accessi di un sito intranet. Sarebbe facile se la società non avesse più di 200 dipendenti e autorizzazioni personalizzate per quasi tutti. È una follia, lo so, ma non posso cambiarlo.Esiste una semplice implementazione generica del controllo degli accessi basato su regole?

Quindi, ho cercato di trovare un'implementazione generica che potesse soddisfare le mie esigenze, ma non riuscivo a trovarla, quindi sono andato a farlo da solo. Alla fine, ho trovato una soluzione abbastanza generica che mi ha fatto pensare: qualcuno deve averlo fatto prima!

L'ho chiamato STOP (oggetto Oggetto autorizzazione) Controllo accesso. Ho la seguente relazione:

.-------.  .-----------.  .-------. 
| users |1---*| STOPRules |*---1| tasks | 
`-------'  '-----------'  '-------' 

Un ARRESTO regola ha i seguenti attributi

STOPRule { 
    Subject; 
    Task; 
    ObjectType; 
    Permission; 
    Relation; 
} 

La relazione oggetto può essere: proprietario, creatore, revisore, ecc Questo campo non è obbligatorio, per supportare compiti generici. Quando è lì, la relazione tra l'utente corrente e l'istanza dell'oggetto viene calcolata da un delegato. La relazione corrente viene quindi confrontata con la relazione richiesta sulla regola per consentire o negare l'accesso.

Fammi sapere se non ero abbastanza chiaro.

Due domande sorgono:

  1. C'è un'implementazione open source come questo?

  2. Vedi qualche problema che incontrerei seguendo questo percorso?

EDIT: Sono andato avanti e in realtà iniziato ad attuare questo modello. Il primo problema era che avevo bisogno della relazione tra soggetto e oggetto per supportare qualsiasi caso d'uso. Ora, posso memorizzare la seguente regola:

John (soggetto) può (permesso) modifica (task) un ordine (oggetto) se egli è il creatore (relazione) del ordine.

Per favore, potete fornire un caso d'uso REALISTICO che non potrebbe essere espresso usando questo modello?

+2

+1 per l'atmosfera di tipo "spazio ufficio" - probabilmente tutti compilate anche rapporti di tps. – JonH

+0

A parte il design del tuo modello, il [controllo di accesso basato sui ruoli] (http://en.wikipedia.org/wiki/Role-based_access_control) sembra adattarsi al modello di legge? Il tuo titolo era così vicino a questo mi chiedevo se fosse quello che intendevi in ​​origine. –

+0

@Ninefingers no, sfortunatamente non lo è. AC basato su rOle e AC basato su rour condividono lo stesso acronimo ma sono diversi e intendevo il secondo. Sulla CA basata su regole, le regole per l'accesso sono definite nell'oggetto (o risorsa) da proteggere (parlando da una vista di sistema operativo) adattandolo a Web, la cosa più vicina che ho visto è Zend_Acl un'implementazione ACL su Zend framework, ma si aspetta che io carichi tutte le autorizzazioni, dal momento che è rOle e non basato su rUle, presuppone che ci saranno molte meno regole di autorizzazione. – svallory

risposta

1

Che dire di avere effettivamente una tabella con autorizzazioni raggruppate per determinati ruoli e utilizzare un'altra tabella per autorizzazioni estese che sovrascrivere quelle generali. Se è il caso di lasciare solo a John accedere a qualcosa, perché anche menzionare che l'altra persona non può? Come per l'ultimo esempio che hai fornito nel commento precedente: esiste una tabella con le autorizzazioni. Un record assomiglia a: 1645 edit_some_field. Quindi group_permissions assomiglia a: 1645 everyone false e la tabella delle eccezioni finale sarebbe 1645 (Jane Doe's ID) true.

Se, diciamo che ci sono 50 persone che hanno accesso a modificare questo campo, quindi basta aggiungere un altro gruppo nella tabella gruppo come: 89 editors_of_field_X, mettere gli ID della gente in una tabella group_members come 89 (John Smith's ID) true. E poi sul passo finale puoi scavalcare quelli con le autorizzazioni di una sola persona come ho detto sopra. Quindi, in conclusione, avresti uno schema a 3 livelli. Ognuno-gruppo-persona.E più approfondisci la tua importanza più alta di quel ruolo. Ad esempio se tutti non sono ammessi, ma il gruppo in cui ti trovi è consentito, puoi modificare qualcosa.

Inoltre, se non ti è consentito accedere a livello di terza persona, poi di nuovo, sei diventato un'eccezione nel gruppo. In questo modo sarai in grado di riutilizzare i gruppi per dopo, aggiungendo solo modifiche minori.

+0

Cosa succede se una persona è membro di due gruppi e uno è autorizzato a modificare e l'altro no? – wchargin

+0

Buon punto. Ma è lasciato per decisione all'autore della domanda: o non permesso, o permesso o controllando l'ultimo. –

+0

Ehi, @ AndriusNaruševičius, grazie per aver trovato il tempo di rispondere con così tanto dettaglio. Poiché i progetti hanno una scadenza (sono passati 20 giorni da quando ho chiesto), sono andato avanti e ho implementato il modello che descrivo. Bene, un pò. Ho fatto dei miglioramenti. Per esempio. non ha senso definire un utente quando si definisce la relazione con l'oggetto. Scriverò qualcosa su ciò che mi è venuto in mente e postare qui più tardi. Per quanto riguarda la tua risposta, la commenterò più avanti, ma fondamentalmente hai descritto come funziona il controllo degli accessi basato su rOle. – svallory

1

John ha creato un ordine e vuole consentire a Bob di visualizzarlo.

+0

Si salva da qualche parte che bob è stato invitato a visualizzare quell'ordine (in modo che il sistema sia in grado di valutare la relazione "invitata" al runtime, come fa per qualsiasi relazione) e di aggiungere STOPRules (utente, attività, tipo_oggetto, permesso, relazione) i valori (null, "view", "order", "allow", "invite"). Sono giunto alla conclusione che l'impostazione dell'utente è utile solo per le eccezioni. Buon esempio, però! – svallory

Problemi correlati