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

RBAC

Определение роли

[role_definition] используется для определения отношений наследования ролей RBAC. Casbin поддерживает несколько экземпляров систем RBAC, где у пользователей могут быть роли и их отношения наследования, а у ресурсов могут быть роли и их отношения наследования. Эти две системы RBAC не будут мешать друг другу.

Этот раздел необязателен. Если вы не используете роли RBAC в модели, то пропустите этот раздел.

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

Вышеуказанное определение роли показывает, что g - это система RBAC, а g2 - другая система RBAC. _,_ означает, что в отношении наследования участвуют две стороны. В наиболее распространенном случае вы обычно используете g в одиночку, если вам нужны только роли для пользователей. Вы также можете использовать и g, и g2, когда вам нужны роли (или группы) как для пользователей, так и для ресурсов. Пожалуйста, посмотрите rbac_model.conf и rbac_model_with_resource_roles.conf для примеров.

Casbin хранит фактическое отображение пользователь-роль (или отображение ресурс-роль, если вы используете роли на ресурсах) в политике. Например:

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

Это означает, что alice наследует/является членом роли data2_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. Не используйте одно и то же имя для пользователя и роли в системе RBAC, потому что Casbin распознает пользователей и роли как строки, и у Casbin нет способа узнать, указываете ли вы пользователя alice или роль alice. Вы можете просто решить это, используя role_alice.
  4. Если у A есть роль B, и у B есть роль C, то у A есть роль C. Эта транзитивность на данный момент бесконечна.
Соглашение о названии токена

Согласно соглашению, имя токена субъекта в определении политики - sub и размещается в начале. Теперь Golang Casbin поддерживает настраиваемые имена токенов и места. Если имя токена субъекта - sub, токен субъекта может быть размещен в произвольном месте без необходимости каких-либо дополнительных действий. Если имя токена субъекта не является sub, e.SetFieldIndex() для constant.SubjectIndex должен быть вызван после инициализации принудителя, независимо от его позиции.

# `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

Иерархия ролей

RBAC Casbin поддерживает функцию иерархии ролей RBAC1, что означает, что если у alice есть role1, и у role1 есть role2, то у 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() для получения всех ролей. Они перечислят все u и все r, соответственно, во всех правилах g, u, r.

Но если вы используете многоуровневый RBAC (с иерархией ролей) и ваше приложение не записывает, является ли имя (строка) пользователем или ролью, или у вас есть пользователь и роль с одинаковым именем, вы можете добавить префикс к роли, например role::admin, перед его передачей в Casbin. Таким образом, вы узнаете, является ли это ролью, проверив этот префикс.

Как запросить неявные роли или разрешения?

Когда пользователь наследует роль или разрешение через иерархию RBAC, а не получает их непосредственно в правиле политики, мы называем этот тип назначения "неявным". Чтобы запросить такие неявные отношения, вам нужно использовать эти два API: GetImplicitRolesForUser() и GetImplicitPermissionsForUser() вместо GetRolesForUser() и GetPermissionsForUser(). Для получения дополнительной информации, пожалуйста, смотрите этот вопрос на GitHub.

Использование сопоставления с образцом в RBAC

Смотрите RBAC с образцом

Менеджер ролей

Смотрите раздел Менеджеры ролей для получения подробной информации.