Vai al contenuto principale

Priority Model

Casbin supporta il caricamento delle politiche con priorità.

Carica Politica con Priorità Implicita

È piuttosto semplice: l'ordine determina la priorità; le politiche che compaiono prima hanno una priorità più alta.

model.conf:

[policy_effect]
e = priority(p.eft) || deny

Carica Politica con Priorità Esplicita

Vedi anche: casbin#550

Un valore di priorità più piccolo indica una priorità più alta. Se c'è un carattere non numerico nella priorità, verrà posizionato per ultimo invece di generare un errore.

Convenzione del nome del token

Il nome del token di priorità comunemente utilizzato nella definizione della politica è "priority". Per utilizzare un nome personalizzato, è necessario invocare e.SetFieldIndex() e ricaricare le politiche (vedi l'esempio completo su TestCustomizedFieldIndex).

model.conf:

[policy_definition]
p = customized_priority, sub, obj, act, eft

Esempio di codice Golang:

e, _ := NewEnforcer("./example/priority_model_explicit_customized.conf",
"./example/priority_policy_explicit_customized.csv")
// Due to the customized priority token, the enforcer fails to handle the priority.
ok, err := e.Enforce("bob", "data2", "read") // the result will be `true, nil`
// Set PriorityIndex and reload
e.SetFieldIndex("p", constant.PriorityIndex, 0)
err := e.LoadPolicy()
if err != nil {
log.Fatalf("LoadPolicy: %v", err)
}
ok, err := e.Enforce("bob", "data2", "read") // the result will be `false, nil`

Attualmente, la priorità esplicita supporta solo AddPolicy e AddPolicies. Se UpdatePolicy è stato chiamato, non dovresti cambiare l'attributo di priorità.

model.conf:

[request_definition]
r = sub, obj, act

[policy_definition]
p = priority, sub, obj, act, eft

[role_definition]
g = _, _

[policy_effect]
e = priority(p.eft) || deny

[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

policy.csv

p, 10, data1_deny_group, data1, read, deny
p, 10, data1_deny_group, data1, write, deny
p, 10, data2_allow_group, data2, read, allow
p, 10, data2_allow_group, data2, write, allow


p, 1, alice, data1, write, allow
p, 1, alice, data1, read, allow
p, 1, bob, data2, read, deny

g, bob, data2_allow_group
g, alice, data1_deny_group

richiesta:

alice, data1, write --> true // because `p, 1, alice, data1, write, allow` has the highest priority
bob, data2, read --> false
bob, data2, write --> true // because bob has the role of `data2_allow_group` which has the right to write data2, and there's no deny policy with higher priority

Carica Politica con Priorità Basata su Ruolo e Gerarchia Utente

La struttura ereditata di ruoli e utenti può essere solo un insieme di alberi multipli, non grafi. Se un utente ha più ruoli, devi assicurarti che l'utente abbia lo stesso livello in diversi alberi. Se due ruoli hanno lo stesso livello, la politica (associata al ruolo) che appare prima ha una priorità maggiore. Per maggiori dettagli, consulta anche casbin#833 e casbin#831.

model.conf:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act, eft

[role_definition]
g = _, _

[policy_effect]
e = subjectPriority(p.eft) || deny

[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

policy.csv

p, root, data1, read, deny
p, admin, data1, read, deny

p, editor, data1, read, deny
p, subscriber, data1, read, deny

p, jane, data1, read, allow
p, alice, data1, read, allow

g, admin, root

g, editor, admin
g, subscriber, admin

g, jane, editor
g, alice, subscriber

Richiesta:

jane, data1, read --> true // because jane is at the bottom, her priority is higher than that of editor, admin, and root
alice, data1, read --> true

La gerarchia dei ruoli è simile a questa:

role: root
└─ role: admin
├─ role editor
│ └─ user: jane

└─ role: subscriber
└─ user: alice

La priorità si presenta automaticamente in questo modo:

role: root                 # auto priority: 30
└─ role: admin # auto priority: 20
├─ role: editor # auto priority: 10
└─ role: subscriber # auto priority: 10