Vai al contenuto principale

How It Works

In Casbin, un modello di controllo degli accessi è astratto in un file CONF basato sul metamodello PERM (Policy, Effect, Request, Matchers). Cambiare o aggiornare il meccanismo di autorizzazione per un progetto è semplice come modificare una configurazione. Puoi personalizzare il tuo modello di controllo degli accessi combinando i modelli disponibili. Ad esempio, puoi combinare ruoli RBAC e attributi ABAC all'interno di un singolo modello e condividere un insieme di regole di policy.

Il modello PERM è composto da quattro fondamenti: Policy, Effect, Request e Matchers. Questi fondamenti descrivono la relazione tra risorse e utenti.

Request

Definisce i parametri della richiesta. Una richiesta di base è un oggetto tupla, che richiede almeno un soggetto (entità a cui si accede), un oggetto (risorsa a cui si accede) e un'azione (metodo di accesso).

Ad esempio, una definizione di richiesta potrebbe essere simile a questa:

Questa definizione specifica i nomi dei parametri e l'ordine richiesto dalla funzione di corrispondenza del controllo di accesso.

Policy

Definisce il modello per la strategia di accesso. Specifica il nome e l'ordine dei campi nel documento della regola della Politica.

Ad esempio:

Nota: Se eft (risultato della politica) non è definito, il campo del risultato nel file della politica non verrà letto e il risultato della politica corrispondente sarà consentito di default.

Matcher

Definisce le regole di corrispondenza per la Richiesta e la Policy.

Ad esempio: m = r.sub == p.sub && r.act == p.act && r.obj == p.obj Il risultato della strategia verrà salvato in p.eft.

Effect

Esegue una combinazione logica di giudizio sui risultati di corrispondenza dei Matcher.

Ad esempio: e = some(where(p.eft == allow))

Questa affermazione significa che se il risultato della strategia di corrispondenza p.eft ha il risultato di (alcuni) allow, allora il risultato finale è vero.

Diamo un'occhiata a un altro esempio:

e = some(where (p.eft == allow)) && !some(where (p.eft == deny))

Il significato logico di questa combinazione di esempio è: se esiste una strategia che corrisponde al risultato di allow e nessuna strategia che corrisponde al risultato di deny, il risultato è true. In altre parole, è true quando tutte le strategie corrispondenti sono allow. Se c'è qualche deny, entrambe sono false (più semplicemente, quando allow e deny esistono contemporaneamente, deny ha la precedenza).

Il modello più basilare e semplice in Casbin è ACL. Il modello CONF per ACL è il seguente:

# Request definition
[request_definition]
r = sub, obj, act

# Policy definition
[policy_definition]
p = sub, obj, act

# Policy effect
[policy_effect]
e = some(where (p.eft == allow))

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

Un esempio di policy per il modello ACL è:

p, alice, data1, read
p, bob, data2, write

Ciò significa:

  • alice può leggere data1
  • bob può scrivere data2

Supportiamo anche la modalità multi-linea aggiungendo '' alla fine:

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj \
&& r.act == p.act

Inoltre, se stai utilizzando ABAC, puoi provare l'operatore 'in' come mostrato nell'esempio seguente per l'edizione golang di Casbin (jCasbin e Node-Casbin non sono ancora supportati):

# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')

Ma DEVI assicurarti che la lunghezza dell'array sia MAGGIORE di 1, altrimenti causerà un panico.

Per ulteriori operatori, potresti dare un'occhiata a govaluate.