Come posso creare e gestire le autorizzazioni in modo più dinamico?

6

Desidero implementare un sistema di sicurezza nella mia applicazione Intranet basata sul web che consente agli amministratori della sicurezza di "perfezionare" esattamente il tipo di accesso che un utente / ruolo ha a un oggetto. Ad esempio, una soluzione basata su ACL potrebbe consentire a un addetto alla reception di accedere a Create , Read e Update a un appuntamento ma non a Delete , analogamente potrei essere in grado di consentire all'utente Bob solo Read o Comment su un promemoria aziendale, ma non Create , Update o Delete di essi.

Tuttavia, come potrei fare per consentire a un addetto alla reception di fissare gli appuntamenti solo negli orari di apertura? Come potrei limitare gli appuntamenti alle date da oggi a un mese da oggi? Che dire di Bob - come gli avrei lasciato Create di un promemoria dopo aver guadagnato abbastanza punti di "rispetto" (un po 'come qui).

Fondamentalmente, come posso mantenere dinamici questi valori (orari di apertura, limiti di data, punti di rispetto, qualche nuovo vincolo) in modo che non li codifichi nell'applicazione? Qualcuno può raccomandare un metodo (o framework, libro da leggere ecc.) In modo che possa lasciare che l'amministratore crei e gestisca questi ruoli e i loro vincoli piuttosto che il programmatore?

L'ACL esistente e i sistemi basati sui ruoli che ho visto non sembrano offrire alcun modo per gestire i vincoli: o hai accesso o no!

Grazie

    
posta boatingcow 07.01.2013 - 00:26
fonte

4 risposte

5

Non so quali framework sono disponibili per le tecnologie che usi ma come soluzione generica potresti usare un basato su regole sistema per esprimere e valutare i permessi.

Le regole potrebbero essere qualcosa come:

IF CurrentUser.IsInRole("Receptionists") AND CurrentTime.IsOpeningHour() 
THEN GrantSomePermission()

IF CurrentUser.IsManager() OR (CurrentUser.IsLead() AND CurrentUser.NotInGroup("X"))
THEN DenySomething()

L'amministratore avrebbe bisogno di crearli. Questo potrebbe essere o attraverso un linguaggio e un editor minimalista o attraverso una semplice interfaccia utente simile a quelle in cui si creano le query (aggiungere condizioni, raggrupparle, selezionare operatori, ecc.).

Lo svantaggio di un simile approccio è trovare il problema quando qualcosa va storto. Il debug di tali regole potrebbe essere complicato. Inoltre, l'ordine di esecuzione delle regole potrebbe essere una sfida.

    
risposta data 07.01.2013 - 01:05
fonte
1

Come ha sottolineato @victor. i sistemi di autorizzazione basati su regole consentono di ottimizzare l'accesso alle azioni degli utenti controllando attributi arbitrari per ciascun utente.

nel mondo rubino su rotaie c'è ad es. autorizzazione_sostituzionale che può servire da esempio su come le regole interagiscono con i ruoli degli utenti. puoi prenderlo come esempio su cosa può essere fatto e come usare l'autorizzazione basata su regole in un framework MVC.

per quanto riguarda le regole dinamiche: puoi leggere qualsiasi origine dati durante il controllo dell'autorizzazione (ad esempio, gli orari di apertura in una tabella "Impostazioni" nel tuo database).

NB: i sistemi basati su regole possono ottenere molto rapidamente molto complessi quando si aggiungono regole (e / o ruoli). quindi, il test completo (automatizzato) è la strada da percorrere.

    
risposta data 07.01.2013 - 19:13
fonte
1

Potresti semplicemente aggiungere metodi al tuo oggetto utente:

public boolean makeAppointmentsWhileOpen(Date d) {
    return this.makeAnyAppointment || isBusinessHour(d) < 30;
}

public boolean makeAppointmentFor(Date d) {
    return this.makeAnyAppointment ||
           (daysDiff(d, today) < 30);
}
public boolean createMemo() {
    return this.reputationPoints >= MIN_MEMO_POINTS;
}

Quello che sto dicendo è che non hai bisogno di un framework per modellare le regole di autorizzazione. Se un framework funziona per le tue esigenze, è grandioso. In caso contrario, aggiungi i campi necessari alla tua tabella di database user o calcola le autorizzazioni al volo da altri campi come sopra.

Come con qualsiasi sistema di permessi, il test è fondamentale.

    
risposta data 07.01.2013 - 19:34
fonte
0

Potrei voler usare Google per il termine "ABAC" (controllo dell'accesso basato sull'accesso)

Definizione (wikipedia): Controllo degli accessi basato sugli attributi (ABAC) definisce un paradigma di controllo dell'accesso in base al quale i diritti di accesso sono concessi agli utenti attraverso l'uso di criteri che combinano insieme gli attributi. Le politiche possono utilizzare qualsiasi tipo di attributi (attributi utente, attributi risorsa, oggetto, attributi dell'ambiente ecc.). Questo modello supporta la logica booleana, in cui le regole contengono istruzioni "IF, THEN" su chi sta effettuando la richiesta, la risorsa e l'azione. Ad esempio: se il richiedente è un gestore, THEN consente l'accesso in lettura / scrittura ai dati sensibili. (Wikipedia)

Caso di utilizzo tipico: Un ortopedico ha poco uso della storia medica del paziente, a meno che non si tratti di disturbi muscolari specifici, mentre un anestesista ha scarso interesse nei disturbi muscolari di un paziente, ma richiede informazioni su un intervento chirurgico passato e / o allergie del paziente, prima di un'operazione. Fonte: link

Interessanti risorse aggiuntive:

Nota: Axiomatics AB, la Svezia sembra essere una società coinvolta nello sviluppo dello standard OASIS "XACML" e agisce ora come consulente commerciale.

    
risposta data 12.07.2016 - 10:18
fonte