RBAC
역할 정의
[role_definition]
은 RBAC 역할 상속 관계를 정의하는 데 사용됩니다. Casbin은 사용자가 역할과 그들의 상속 관계를 가질 수 있고, 리소스도 역할과 그들의 상속 관계를 가질 수 있는 RBAC 시스템의 여러 인스턴스를 지원합니다. 이 두 개의 RBAC 시스템은 서로 간섭하지 않습니다.
이 섹션은 선택 사항입니다. 모델에서 RBAC 역할을 사용하지 않는 경우, 이 섹션을 생략하십시오.
[role_definition]
g = _, _
g2 = _, _
위의 역할 정의는 g
가 RBAC 시스템이고 g2
가 또 다른 RBAC 시스템임을 보여줍니다. _,_
는 상속 관계에 두 당사자가 참여하고 있음을 의미합니다. 가장 일반적인 경우에는, 사용자에게만 역할이 필요한 경우 g
를 단독으로 사용합니다. 사용자와 리소스 모두에게 역할(또는 그룹)이 필요한 경우 g
와 g2
를 모두 사용할 수 있습니다. 예제를 보려면 rbac_model.conf와 rbac_model_with_resource_roles.conf를 참조하십시오.
Casbin은 실제 사용자-역할 매핑(또는 리소스에 역할을 사용하는 경우 리소스-역할 매핑)을 정책에 저장합니다. 예를 들어:
p, data2_admin, data2, read
g, alice, data2_admin
이것은 alice
가 data2_admin
역할을 상속/멤버임을 의미합니다. 여기서 alice
는 사용자, 리소스, 또는 역할이 될 수 있습니다. Casbin은 이를 문자열로만 인식합니다.
그런 다음, 매처에서는 아래와 같이 역할을 확인해야 합니다:
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
이것은 요청의 sub
이 정책의 역할 sub
을 가져야 함을 의미합니다.
- Casbin은 사용자-역할 매핑만 저장합니다.
- Casbin은 사용자가 유효한 사용자인지 또는 역할이 유효한 역할인지를 검증하지 않습니다. 이것은 인증에 의해 처리되어야 합니다.
- Casbin이 사용자와 역할을 문자열로 인식하기 때문에, RBAC 시스템 내에서 사용자와 역할에 동일한 이름을 사용하지 마십시오. Casbin이 사용자
alice
를 지정하는지 아니면 역할alice
를 지정하는지 알 수 없습니다. 이것은 단순히role_alice
를 사용함으로써 해결할 수 있습니다. A
가B
역할을 가지고 있고,B
가C
역할을 가지고 있다면,A
는C
역할을 가집니다. 이 전이성은 현재 무한합니다.
관례적으로, 정책 정의에서의 주제 토큰 이름은 sub
이며 처음에 위치합니다. 이제, Golang Casbin은 사용자 정의 토큰 이름과 위치를 지원합니다. 주제 토큰 이름이 sub
인 경우, 주제 토큰은 추가 작업 없이 임의의 위치에 놓을 수 있습니다. 주제 토큰 이름이 sub
이 아닌 경우, 위치에 상관없이 강제자가 초기화된 후에 constant.SubjectIndex
에 대해 e.SetFieldIndex()
를 호출해야 합니다.
# `subject` here is for sub
[policy_definition]
p = obj, act, subject
e.SetFieldIndex("p", constant.SubjectIndex, 2) // index starts from 0
ok, err := e.DeleteUser("alice") // without SetFieldIndex, it will raise an error
역할 계층구조
Casbin의 RBAC은 RBAC1의 역할 계층구조 기능을 지원하는데, 이는 alice
가 role1
을 가지고 있고, role1
이 role2
를 가지고 있다면, alice
는 또한 role2
를 가지게 되고 그 권한을 상속받게 된다는 것을 의미합니다.
여기서 우리는 계층 수준이라는 개념을 가지고 있습니다. 그래서, 이 예제에서 계층 수준은 2입니다. Casbin의 내장 역할 관리자에서는 최대 계층 수준을 지정할 수 있습니다. 기본값은 10입니다. 이는 alice
와 같은 최종 사용자가 역할의 10단계를 상속받을 수 있다는 것을 의미합니다.
// NewRoleManager is the constructor for creating an instance of the
// default RoleManager implementation.
func NewRoleManager(maxHierarchyLevel int) rbac.RoleManager {
rm := RoleManager{}
rm.allRoles = &sync.Map{}
rm.maxHierarchyLevel = maxHierarchyLevel
rm.hasPattern = false
return &rm
}
역할과 사용자를 어떻게 구분하나요?
Casbin은 RBAC에서 역할과 사용자를 구분하지 않습니다. 둘 다 문자열로 취급됩니다. 단일 수준 RBAC만 사용하는 경우(역할이 다른 역할의 멤버가 될 수 없는 경우), e.GetAllSubjects()
를 사용하여 모든 사용자를 가져오고 e.GetAllRoles()
를 사용하여 모든 역할을 가져올 수 있습니다. 그들은 모든 g, u, r
규칙에서 모든 u
와 모든 r
을 나열할 것입니다.
하지만 여러 수준의 RBAC(역할 계층구조가 있는)를 사용하고 있고, 애플리케이션이 이름(문자열)이 사용자인지 역할인지를 기록하지 않거나, 같은 이름의 사용자와 역할이 있는 경우, Casbin에 전달하기 전에 역할에 role::admin
과 같은 접두사를 추가할 수 있습니다. 이렇게 하면 이 접두사를 확인함으로써 역할인지 알 수 있습니다.
암시적 역할 또는 권한을 어떻게 쿼리하나요?
사용자가 RBAC 계층을 통해 역할이나 권한을 상속받거나 정책 규칙에서 직접 할당받지 않는 경우, 이러한 유형의 할당을 '암시적'이라고 합니다. 이러한 암시적 관계를 쿼리하려면, GetRolesForUser()
와 GetPermissionsForUser()
대신에 GetImplicitRolesForUser()
와 GetImplicitPermissionsForUser()
라는 두 가지 API를 사용해야 합니다. 자세한 내용은 이 GitHub 이슈를 참조하십시오.
RBAC에서 패턴 매칭 사용하기
패턴이 있는 RBAC를 참조하십시오.
역할 관리자
자세한 내용은 역할 관리자 섹션을 참조하십시오.