주요 콘텐츠로 건너뛰기

How It Works

Casbin에서는 액세스 제어 모델이 **PERM 메타모델 (정책, 효과, 요청, 매처)**을 기반으로 CONF 파일로 추상화됩니다. 프로젝트의 권한 부여 메커니즘을 전환하거나 업그레이드하는 것은 구성을 수정하는 것만큼 간단합니다. 사용 가능한 모델을 결합하여 자신만의 액세스 제어 모델을 사용자 정의할 수 있습니다. 예를 들어, 하나의 모델 내에서 RBAC 역할과 ABAC 속성을 함께 결합하고 하나의 정책 규칙 세트를 공유할 수 있습니다.

PERM 모델은 정책, 효과, 요청, 매처의 네 가지 기반으로 구성됩니다. 이러한 기반은 리소스와 사용자 간의 관계를 설명합니다.

Request

요청 매개변수를 정의합니다. 기본 요청은 튜플 객체로, 적어도 주체(접근된 엔티티), 객체(접근된 리소스), 액션(접근 방법)이 필요합니다.

예를 들어, 요청 정의는 다음과 같이 보일 수 있습니다: r={sub,obj,act}

이 정의는 액세스 제어 매칭 함수에 필요한 매개변수 이름과 순서를 지정합니다.

Policy

액세스 전략의 모델을 정의합니다. 정책 규칙 문서의 필드 이름과 순서를 지정합니다.

예를 들어: p={sub, obj, act} 또는 p={sub, obj, act, eft}

참고: eft (정책 결과)가 정의되지 않은 경우, 정책 파일의 결과 필드는 읽히지 않으며, 매칭 정책 결과는 기본적으로 허용됩니다.

Matcher

요청과 정책에 대한 매칭 규칙을 정의합니다.

예를 들어: m = r.sub == p.sub && r.act == p.act && r.obj == p.obj 이 간단하고 일반적인 매칭 규칙은 요청된 매개변수(엔티티, 리소스, 메소드)가 정책에서 찾은 것과 같으면 정책 결과(p.eft)가 반환된다는 것을 의미합니다. 전략의 결과는 p.eft에 저장됩니다.

Effect

매처의 매칭 결과에 대한 논리적 조합 판단을 수행합니다.

예를 들어: e = some(where(p.eft == allow))

이 문장은 매칭 전략 결과 p.eft가 (일부) 허용의 결과를 가지면 최종 결과는 참이라는 것을 의미합니다.

다른 예를 살펴봅시다:

e = some(where (p.eft == allow)) && !some(where (p.eft == deny))

이 예제 조합의 논리적 의미는: 허용의 결과와 일치하는 전략이 있고 거부의 결과와 일치하는 전략이 없으면 결과는 참입니다. 다시 말해, 매칭 전략이 모두 허용일 때 참입니다. 거부가 있으면 둘 다 거짓입니다 (더 간단하게 말하면, 허용과 거부가 동시에 존재할 때 거부가 우선합니다).

Casbin에서 가장 기본적이고 간단한 모델은 ACL입니다. ACL에 대한 모델 CONF는 다음과 같습니다:

# Request definition
[request_definition]
r = sub, obj, act

# Policy definition
[policy_definition]
p = sub, obj, act

# Policy effect
[policy_effect]
e = some(where (p.eft == allow))

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

ACL 모델에 대한 예제 정책은 다음과 같습니다:

p, alice, data1, read
p, bob, data2, write

이것은 다음을 의미합니다:

  • 앨리스는 data1을 읽을 수 있습니다
  • 밥은 data2를 쓸 수 있습니다

또한, 끝에 ''를 추가함으로써 여러 줄 모드를 지원합니다:

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj \
&& r.act == p.act

게다가, ABAC를 사용하고 있다면, 아래 예시와 같이 Casbin golang edition에서 'in' 연산자를 시도해 볼 수 있습니다 (jCasbin과 Node-Casbin은 아직 지원되지 않습니다):

# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')

하지만 배열의 길이가 1보다 긴지 반드시 확인해야 합니다. 그렇지 않으면 패닉을 일으킬 수 있습니다.

더 많은 연산자를 보려면, govaluate를 살펴보세요.