RBAC with Pattern
Быстрый старт
Используйте шаблон в
g(_, _)
.e, _ := NewEnforcer("./example.conf", "./example.csv")
e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)Используйте шаблон с доменом.
e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
Используйте все шаблоны.
Просто объедините использование обоих API.
Как показано выше, после создания экземпляра enforcer
, вам нужно активировать сопоставление с шаблоном через API AddNamedMatchingFunc
и AddNamedDomainMatchingFunc
, которые определяют, как происходит сопоставление с шаблоном.
Если вы используете онлайн-редактор, он указывает функцию сопоставления с шаблоном в нижнем левом углу.
Используйте сопоставление с шаблоном в 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
роль p.sub
в домене r.dom
. Вот так работает сопоставитель. Вы можете увидеть полный пример здесь.
Помимо синтаксиса сопоставления с шаблоном выше, мы также можем использовать чистый шаблон домена.
Например, если мы хотим, чтобы 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
могла читать и записывать data
в domain1 и domain2. Сопоставление шаблона *
в g
дает alice
доступ к двум доменам.
By using pattern matching, especially in scenarios that are more complicated and have a lot of domains or objects to consider, we can implement the policy_definition
in a more elegant and effective way.