주요 콘텐츠로 건너뛰기

RBAC

역할 정의

[role_definition]은 RBAC 역할 상속 관계를 정의하는 데 사용됩니다. Casbin은 사용자가 역할과 그들의 상속 관계를 가질 수 있고, 리소스도 역할과 그들의 상속 관계를 가질 수 있는 RBAC 시스템의 여러 인스턴스를 지원합니다. 이 두 개의 RBAC 시스템은 서로 간섭하지 않습니다.

이 섹션은 선택 사항입니다. 모델에서 RBAC 역할을 사용하지 않는 경우, 이 섹션을 생략하십시오.

[role_definition]
g = _, _
g2 = _, _

위의 역할 정의는 g가 RBAC 시스템이고 g2가 또 다른 RBAC 시스템임을 보여줍니다. _,_는 상속 관계에 두 당사자가 참여하고 있음을 의미합니다. 가장 일반적인 경우에는, 사용자에게만 역할이 필요한 경우 g를 단독으로 사용합니다. 사용자와 리소스 모두에게 역할(또는 그룹)이 필요한 경우 gg2를 모두 사용할 수 있습니다. 예제를 보려면 rbac_model.confrbac_model_with_resource_roles.conf를 참조하십시오.

Casbin은 실제 사용자-역할 매핑(또는 리소스에 역할을 사용하는 경우 리소스-역할 매핑)을 정책에 저장합니다. 예를 들어:

p, data2_admin, data2, read
g, alice, data2_admin

이것은 alicedata2_admin 역할을 상속/멤버임을 의미합니다. 여기서 alice는 사용자, 리소스, 또는 역할이 될 수 있습니다. Casbin은 이를 문자열로만 인식합니다.

그런 다음, 매처에서는 아래와 같이 역할을 확인해야 합니다:

[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

이것은 요청의 sub이 정책의 역할 sub을 가져야 함을 의미합니다.

노트
  1. Casbin은 사용자-역할 매핑만 저장합니다.
  2. Casbin은 사용자가 유효한 사용자인지 또는 역할이 유효한 역할인지를 검증하지 않습니다. 이것은 인증에 의해 처리되어야 합니다.
  3. Casbin이 사용자와 역할을 문자열로 인식하기 때문에, RBAC 시스템 내에서 사용자와 역할에 동일한 이름을 사용하지 마십시오. Casbin이 사용자 alice를 지정하는지 아니면 역할 alice를 지정하는지 알 수 없습니다. 이것은 단순히 role_alice를 사용함으로써 해결할 수 있습니다.
  4. AB 역할을 가지고 있고, BC 역할을 가지고 있다면, AC 역할을 가집니다. 이 전이성은 현재 무한합니다.
토큰 이름 규칙

관례적으로, 정책 정의에서의 주제 토큰 이름은 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의 역할 계층구조 기능을 지원하는데, 이는 alicerole1을 가지고 있고, role1role2를 가지고 있다면, 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를 참조하십시오.

역할 관리자

자세한 내용은 역할 관리자 섹션을 참조하십시오.