RBAC Yii2 не работает с ролями по умолчанию

Я следую Полному руководству по Yii 2.0. В моем приложении у меня две роли: администратор, который может делать все, и зритель, который может выполнять некоторые действия, которые не могут выполнять незарегистрированные пользователи. Я пытаюсь использовать функции ролей по умолчанию в Yii 2 RBAC, но, похоже, это не работает. Таблица пользователей в моей базе данных имеет столбец с именем «роль»: для администратора это значение установлено в 1 и для зрителей = 2.

Что я сделал:

/app/rbac/UserGroupRule.php

namespace app\rbac;

use Yii;
use yii\rbac\Rule;

class UserGroupRule extends Rule {
public $name = 'userGroup';

public function execute($user, $item, $params) {
if (!Yii::$app->user->isGuest) {
$group = Yii::$app->user->identity->role;
if ($item->name === 'admin') {
return $group == 1;
} elseif ($item->name === 'viewer') {
return $group == 1 || $group == 2;
}
}
return false;
}
}

$auth = Yii::$app->authManager;

$rule = new \app\rbac\UserGroupRule;
$auth->add($rule);

$author = $auth->createRole('viewer');
$author->ruleName = $rule->name;
$auth->add($viewer);

$admin = $auth->createRole('admin');
$admin->ruleName = $rule->name;
$auth->add($admin);
$auth->addChild($admin, $viewer);

в моем контроллере:

public function behaviors() {
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['admin'],
'rules' => [
[
'allow' => true,
'actions' => ['admin'],
'roles' => ['admin'],
],
],
],
];
}

Когда я пытаюсь получить доступ к действию «администратор», появляется сообщение «Запрещено # 403», даже когда я являюсь администратором. Как заставить это работать?

2

Решение

Таблица пользователей в моей базе данных имеет столбец с именем «роль»: для администратора это значение равно 1, а для зрителей = 2

К сожалению, это не так.
Права / роли, которыми обладает пользователь (по умолчанию), выполняются через auth_assignment-Таблица.
Просто добавьте в него запись:

INSERT INTO `auth_assignment` VALUES ("admin", <user-id>, NOW());

(не забудьте изменить идентификатор пользователя на любого пользователя, которого вы хотите сделать администратором.

Это должно решить вашу проблему.

Отредактируйте (поскольку я неправильно понял ваш вопрос):

Согласно эта ссылка вы действительно можете определить роли по умолчанию, но вы также должны перенастроить authManager-компонент в файле конфигурации для включения ролей по умолчанию:

'components' => [
'authManager' => [
// ...
'defaultRoles' => ['admin', 'viewer'],
],
],

В этом списке ролей указаны разрешения, которые всегда следует проверять для каждого пользователя, независимо от того, есть ли у него запись в auth_assignmentили нет.

3

Другие решения

Я столкнулся с той же проблемой с оп. Наконец-то заставил его работать, немного поработав с xdebug.

Я чувствую официальную документацию по роли по умолчанию отсутствует пара важных моментов, ниже я приведу их краткий обзор с некоторыми из моих личных опытов. Структура проекта основана на расширенном шаблоне проекта Yii 2.0

user таблица содержит id а также group, куда group это тип int1 для admin и 2 для author

Код упрощен для наглядности.

Класс правил, в который вы помещаете фактическую логику правил.

юй / консоли / контроллер / UserGroupRule.php

namespace app\rbac;

use Yii;
use yii\rbac\Rule;

/**
* Checks if user group matches
*/
class UserGroupRule extends Rule
{
public $name = 'userGroup';

public function execute($user, $item, $params)
{
if (!Yii::$app->user->isGuest) {
$group = Yii::$app->user->identity->group;
if ($item->name === 'admin') {
return $group == 1;
} elseif ($item->name === 'author') {
return $group == 1 || $group == 2;
}
}
return false;
}
}

Теперь определяем роли ..

юй / консоли / контроллер / RbacController.php

namespace console\controllers;

use Yii;
use yii\console\Controller;

class RbacController extends Controller
{
public function actionInit()
{
$auth = Yii::$app->authManager;

$rule = new \app\rbac\UserGroupRule;
$auth->add($rule);

$admin = $auth->createRole('admin');
$admin->ruleName = $rule->name;
$auth->add($admin);

// define 'author' here...
}
}

После того, как этот файл будет готов, вы сможете запустить ./yii rbac/init для генерации файлов правил:

  • console/rbac/items.php
  • console/rbac/rules.php

Важно: вам нужно поместить сгенерированные файлы в нужную папку приложения, это очень важно. Другие мудрые Yii 2.0 не смогут подобрать правила. Например: yii/backend/rbac/

Это в основном идентично документации

юй / Коммон / конфигурации / main.php

Добавьте следующее в возвращаемый массив:

'authManager' => [
'class' => 'yii\rbac\PhpManager',
'defaultRoles' => ['admin', 'author'], // your define roles
],

Теперь самое интересное, под классом контроллера вы хотели бы применить правила

Yii / Серверные / контроллеры / SiteController.php

'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'actions' => [], // applies to all actions
'roles' => ['admin'], // your defined roles
],
],
],

До этого момента правила должны работать. Под вашим классом контроллера дважды проверьте Yii::$app->getAuthManager() посмотрите, содержит ли он ваши определенные роли. Если нет, это означает, что Yii неправильно выбрал правила, пожалуйста, проверьте предыдущие шаги еще раз.

3

По вопросам рекламы [email protected]