RBAC with Pattern
빠른 시작
g(_, _)
에서 패턴 사용.e, _ := NewEnforcer("./example.conf", "./example.csv")
e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)도메인에서 패턴 사용.
e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
모든 패턴 사용.
두 API의 사용을 결합하기만 하면 됩니다.
위에서 보여진 것처럼, enforcer
인스턴스를 생성한 후에는 AddNamedMatchingFunc
및 AddNamedDomainMatchingFunc
API를 통해 패턴 매칭을 활성화해야 합니다. 이들은 패턴이 어떻게 매칭되는지를 결정합니다.
온라인 편집기를 사용하면 왼쪽 하단에서 패턴 매칭 함수를 지정합니다.
RBAC에서 패턴 매칭 사용
때때로, 특정 주체, 객체, 또는 특정 패턴을 가진 도메인/테넌트가 자동으로 역할을 부여받기를 원할 수 있습니다. RBAC의 패턴 매칭 함수는 이를 도와줄 수 있습니다. 패턴 매칭 함수는 이전의 매처 함수와 동일한 매개변수와 반환 값을 공유합니다.
g
의 각 매개변수를 지원하는 패턴 매칭 함수.
우리는 일반적으로 RBAC가 매처에서 g(r.sub, p.sub)
로 표현된다는 것을 알고 있습니다. 그런 다음 우리는 다음과 같은 정책을 사용할 수 있습니다:
p, alice, book_group, read
g, /book/1, book_group
g, /book/2, book_group
그래서 alice
는 book 1
과 book 2
를 포함한 모든 책을 읽을 수 있습니다. 그러나 수천 권의 책이 있을 수 있고, 각 책을 책 역할(또는 그룹)에 g
정책 규칙으로 추가하는 것은 매우 지루할 수 있습니다.
그러나 패턴 매칭 함수를 사용하면, 단 한 줄로 정책을 작성할 수 있습니다:
g, /book/:id, book_group
Casbin은 자동으로 /book/1
과 /book/2
를 패턴 /book/:id
에 매칭시켜줍니다. 당신은 단지 다음과 같이 enforcer에 함수를 등록할 필요가 있습니다:
- Go
- Node.js
e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
await e.addNamedMatchingFunc('g', Util.keyMatch2Func);
도메인/테넌트에서 패턴 매칭 함수를 사용할 때, 함수를 enforcer와 모델에 등록해야 합니다.
- Go
- Node.js
e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
await e.addNamedDomainMatchingFunc('g', Util.keyMatch2Func);
g(r.sub, p.sub, r.dom)
이 무엇을 의미하는지 이해하지 못한다면, rbac-with-domains를 읽어보세요. 간단히 말해서, g(r.sub, p.sub, r.dom)
은 사용자 r.sub
가 도메인 r.dom
에서 역할 p.sub
를 가지고 있는지 확인합니다. 그래서 이것이 매처가 어떻게 작동하는지입니다. 전체 예제는 여기에서 볼 수 있습니다.
위의 패턴 매칭 구문 외에도, 우리는 순수 도메인 패턴을 사용할 수도 있습니다.
예를 들어, sub
가 domain1
과 domain2
라는 다른 도메인에서 접근 권한을 가지길 원한다면, 순수 도메인 패턴을 사용할 수 있습니다:
p, admin, domain1, data1, read
p, admin, domain1, data1, write
p, admin, domain2, data2, read
p, admin, domain2, data2, write
g, alice, admin, *
g, bob, admin, domain2
이 예제에서는 alice
가 domain1과 domain2에서 data
를 읽고 쓸 수 있도록 하고 싶습니다. g
에서 패턴 매칭 *
을 사용하면 alice
가 두 도메인에 접근할 수 있게 됩니다.
패턴 매칭을 사용하면, 특히 더 복잡하고 고려해야 할 도메인이나 객체가 많은 시나리오에서, 우리는 policy_definition
을 더 우아하고 효과적인 방법으로 구현할 수 있습니다.