Роли пользователя в Yii2, из значения БД
Это может показаться дублирующим, во-первых, но доступные ответы не имеют ясности и не решают мою проблему.
У меня есть список пользователей базы данных, один кортеж будет выглядеть примерно так:
[
'id' => '131',
'username' => 'mat',
'password' => '9a23b6d49aa244b7b0db52949c0932c365ec8191',
'authKey' => 'test100key',
'accessToken' => '100-token',
'role' => 'editor',
]
Теперь я хочу создать тип пользователя с именем manager и установить контроль доступа в контроллере.
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['create', 'view', 'index'], // Define specific actions
'allow' => true, // Has access
'roles' => ['editor'], // '@' All logged in users / or your access role e.g. 'admin', 'user'
],
[
Я пытаюсь достичь этого с минимальными трудностями и не очень хорошо знаком с yii/yii2. RBAC фактически смущает меня, и мне трудно понять документацию.
Мне просто нужно создать три типа пользовательских ролей. Я понимаю контроль доступа к различным действиям.
Пользовательские данные поступают из таблицы, которая будет изменена в реальном времени другим приложением.
2 ответа
Решил это сам. Незначительные изменения в фреймворковом коде, я думаю, у меня возникнут проблемы, если я решу обновить Yii когда-нибудь.
В
vendor/yiisoft/yii2/filters/AccessRule.php изменил метод matchRole следующим образом
protected function matchRole($user)
{
if (empty($this->roles)) {
return true;
}
foreach ($this->roles as $role) {
if ($role === '?') {
if ($user->getIsGuest()) {
return true;
}
} elseif ($role === '@') {
if (!$user->getIsGuest()) {
return true;
}
} elseif ($user->can($role)) {
return true;
}
elseif (isset($user->identity->role)){
if($role == $user->identity->role) {
return true;
}
}
}
return false;
}
Исходя из вашего собственного ответа, я вижу, что вам на самом деле не нужен RBAC, это просто вопрос проверки одного свойства пользователя. Вы можете сделать это непосредственно в контроллере (и вы не должны изменять основные файлы в любом случае):
В контроллере добавьте:
public function behaviors()
{
return [
'access' => [
'class' => \yii\filters\AccessControl::className(),
'only' => ['create', 'view', 'index'],
'rules' => [
[
'allow' => true,
'matchCallback' => function ($rule, $action) {
return !\Yii::$app->user->isGuest
&& \Yii::$app->user->identity->role === 'editor';
},
],
],
],
];
}
matchCallback
это обратный вызов, который будет вызван, чтобы определить, следует ли применять правило. Вы должны сначала проверить, если пользователь не гость в противном случае Yii::$app->user->identity
является null
,