주요 콘텐츠로 건너뛰기

Priority Model

Casbin은 우선 순위가 있는 정책을 로드하는 것을 지원합니다.

암시적 우선 순위로 정책 로드

매우 간단합니다: 순서가 우선 순위를 결정합니다; 먼저 나타나는 정책이 더 높은 우선 순위를 가집니다.

model.conf:

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

명시적 우선 순위로 정책 로드

참고: casbin#550

우선 순위 값이 작을수록 우선 순위가 높습니다. 우선 순위에 숫자가 아닌 문자가 있으면 오류를 발생시키는 대신 마지막에 배치됩니다.

토큰 이름 규칙

정책 정의에서 관례적으로 사용되는 우선 순위 토큰 이름은 "priority"입니다. 사용자 정의를 사용하려면 e.SetFieldIndex()를 호출하고 정책을 다시 로드해야 합니다 (TestCustomizedFieldIndex에서 전체 예제를 확인하세요).

model.conf:

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

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`

현재, 명시적 우선 순위는 AddPolicy & AddPolicies만 지원합니다. UpdatePolicy가 호출되었다면, 우선 순위 속성을 변경해서는 안됩니다.

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

요청:

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

역할 및 사용자 계층에 기반한 우선 순위로 정책 로드

역할과 사용자의 상속 구조는 여러 트리만 가능하며 그래프는 불가능합니다. 사용자가 여러 역할을 가지고 있다면, 사용자가 다른 트리에서 동일한 레벨을 가지고 있는지 확인해야 합니다. 두 역할이 같은 레벨을 가지고 있다면, 먼저 나타난 역할(역할과 연관된)의 정책이 더 높은 우선 순위를 가집니다. 자세한 내용은 casbin#833casbin#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

요청:

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

역할 계층 구조는 다음과 같습니다:

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

└─ role: subscriber
└─ user: alice

우선 순위는 자동으로 다음과 같이 보입니다:

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