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
в политике.
- Casbin хранит только отображение пользователь-роль.
- Casbin не проверяет, является ли пользователь действительным пользователем, или является ли роль действительной ролью. Этим должна заниматься аутентификация.
- Не используйте одно и то же имя для пользователя и роли в системе RBAC, потому что Casbin распознает пользователей и роли как строки, и у Casbin нет способа узнать, указываете ли вы пользователя
alice
или рольalice
. Вы можете просто решить это, используяrole_alice
. - Если у
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 с образцом
Менеджер ролей
Смотрите раздел Менеджеры ролей для получения подробной информации.