Перейти к основному контенту

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, которые определяют, как происходит сопоставление с шаблоном.

заметка

Если вы используете онлайн-редактор, он указывает функцию сопоставления с шаблоном в нижнем левом углу. editor-tips

Используйте сопоставление с шаблоном в 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, как:

e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)

При использовании функции сопоставления с шаблоном в доменах/арендаторах, вам нужно зарегистрировать функцию с помощью enforcer и модели.

e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)

Если вы не понимаете, что означает 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.