RBAC with Domains
도메인 테넌트와 역할 정의
Casbin의 RBAC 역할은 전역 또는 도메인 특정일 수 있습니다. 도메인 특정 역할이란 사용자가 다른 도메인/테넌트에 있을 때 사용자의 역할이 다를 수 있다는 것을 의미합니다. 이는 사용자가 보통 다른 테넌트에 있기 때문에 클라우드와 같은 대규모 시스템에서 매우 유용합니다.
도메인/테넌트와 역할 정의는 다음과 같아야 합니다:
[role_definition]
g = _, _, _
세 번째 _
는 도메인/테넌트의 이름을 나타내며, 이 부분은 변경되어서는 안됩니다. 그런 다음 정책은 다음과 같을 수 있습니다:
p, admin, tenant1, data1, read
p, admin, tenant2, data2, read
g, alice, admin, tenant1
g, alice, user, tenant2
이는 tenant1
의 admin
역할이 data1
을 읽을 수 있다는 것을 의미합니다. 그리고 alice
는 tenant1
에서 admin
역할을 가지고 tenant2
에서는 user
역할을 가집니다. 따라서, 그녀는 data1
을 읽을 수 있습니다. 그러나, alice
는 tenant2
에서 admin
이 아니므로, 그녀는 data2
를 읽을 수 없습니다.
그런 다음, 매처에서는 역할을 다음과 같이 확인해야 합니다:
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act
예제를 위해 rbac_with_domains_model.conf를 참조하십시오.
참고: 관례적으로 정책 정의에서 도메인 토큰 이름은 dom
이며 두 번째 토큰(sub, dom, obj, act
)으로 배치됩니다.
이제, Golang Casbin은 사용자 정의 토큰 이름과 배치를 지원합니다. 도메인 토큰 이름이 dom
인 경우, 도메인 토큰은 추가 조치 없이 임의의 위치에 배치될 수 있습니다. 도메인 토큰 이름이 dom
이 아닌 경우, e.SetFieldIndex()
는 강제자가 초기화된 후에 constant.DomainIndex
에 대해 호출되어야 하며, 그 위치에 상관없습니다.
# `domain` here for `dom`
[policy_definition]
p = sub, obj, act, domain
e.SetFieldIndex("p", constant.DomainIndex, 3) // index starts from 0
users := e.GetAllUsersByDomain("domain1") // without SetFieldIndex, it will raise an error