주요 콘텐츠로 건너뛰기

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

이는 tenant1admin 역할이 data1을 읽을 수 있다는 것을 의미합니다. 그리고 alicetenant1에서 admin 역할을 가지고 tenant2에서는 user 역할을 가집니다. 따라서, 그녀는 data1을 읽을 수 있습니다. 그러나, alicetenant2에서 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