Modèle de priorité
Casbin supporte les politiques de chargement avec priorité.
Politique de charge avec priorité implicitement
C'est assez simple, l'ordre détermine la priorité, la politique apparue plus tôt a une plus grande priorité.
model.conf :
[policy_effect]
e = priorité(p.eft) || nier
Charger la politique avec la priorité explicite
Voir aussi : casbin#550
Le nom du jeton de priorité dans la définition de la politique doit être « priorité », et la plus petite valeur de priorité aura une plus grande priorité. S'il y a des caractères non numériques dans la priorité, ce sera dans le dernier, plutôt que de lancer une erreur. Maintenant, la priorité explicite ne prend en charge que AddPolicy
& AddPolicies
, si UpdatePolicy
a été appelée, vous ne devriez pas changer l'attribut prioritaire.
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
Politique.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, autoriser
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
Requête:
alice, data1, write --> true // pour `p, 1, alice, data1, write, allow` a la plus haute priorité
bob, data2, read --> false
bob, data2, write --> true // for bob has role of `data2_allow_group` which has right to write data2, et il n'y a pas de politique de refus avec une priorité plus élevée
Politique de charge avec priorité basée sur le rôle et la hiérarchie des utilisateurs
La structure héritée des rôles et des utilisateurs ne peut être que de multiples arborescences et non des graphiques. Si un utilisateur a plusieurs rôles, vous devez vous assurer que l'utilisateur a le même niveau dans différentes arborescences. Si deux rôles ont le même niveau, la politique (le rôle correspondant) est apparue plus tôt a une plus grande priorité. plus de détails voir aussi casbin#833
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
Politique.csv
p, root, data1, read, deny
p, admin, data1, read, deny
p, editor, data1, data1 lire, refuser
p, abonné, data1, read, deny
p, jane, data1, read, autoriser
p, alice, data1, read, allow
g, admin, root
g, editor, admin
g, abonné, admin
g, jane, éditeur
g, alice, abonné
Requête:
jane, data1, read --> true // jane est en bas, donc la priorité est supérieure à l'éditeur, admin et racine
alice, data1, read --> true
La hiérarchie des rôles comme ceci:
role: root
└─ role: admin
├─ role editor
│ └─ user: jane
│
└─ role: subscriber
└─ user: john
La priorité ressemble automatiquement à ceci:
Rôle : root # priorité automatique : 30
<unk> ─ rôle : admin # priorité auto : 20
─ rôle : éditeur # priorité automatique : 10
<unk> ─ rôle : abonné # priorité auto : 10