#php #yii2 #frameworks #rbac #yii2-basic-app
#php #yii2 #фреймворки #rbac #yii2-basic-app
Вопрос:
это запись для auth_item, которую я пытаюсь использовать rbac в yii2-basic framework.
код выглядит следующим образом:
config/web.php:
'authManager' => [
'class' => 'yiirbacDbManager',
],
контроллер:
public function actionCreate()
{
if(Yii::$app->user->can('countries/create')){
$chk = 'Can Do';
}else{
$chk = 'Can Not Do';
}
echo $chk;exit();
}
Комментарии:
1. Как вы инициализировали правила? Вы уверены, что в authentication_items есть запись для ‘countries / create’? Похоже, вы пытаетесь использовать контроллер / действие в качестве имени разрешения.
2. просто проверьте, что я отредактировал сообщение и добавил ss для записи для auth_item
3. Вам также необходимо назначить этот элемент пользователям, которым разрешено это разрешение. Затем на контроллере вам нужно проверить, может ли пользователь «разрешить». Создаваемое вами разрешение называется «admin», но вы проверяете наличие «countries / create».
4. Вы проверили раздел руководства по использованию консольного контроллера для создания структуры RBAC? Я мог бы ответить на ваш вопрос здесь, но это была бы в значительной степени копия этого сообщения с использованием ваших имен ролей.
5. я был бы очень благодарен, если бы вы могли это сделать. это похоже на то, что я делаю какую-то ошибку.
Ответ №1:
Убедитесь, что все приведенные ниже пункты работают должным образом.
Информация взята со страниц руководства Yii2, и там она объясняется более подробно.
- Настройте приложение на использование RBAC с данными, хранящимися в базе данных.
'authManager' => [
'class' => 'yiirbacDbManager',
],
- Добавьте и назначьте роли и разрешения для базы данных.
Один из способов, вероятно, самый простой, — использовать консольный контроллер, но тогда вам придется иметь дело с разрешениями на создание пользователя и обновление где-то еще в вашем коде.
<?php
namespace appcommands;
use Yii;
use yiiconsoleController;
class RbacController extends Controller
{
public function actionInit()
{
$auth = Yii::$app->authManager;
$auth->removeAll();
// add "create country" permission better remove '/'
$createCountry = $auth->createPermission('createCountry');
$createCountry->description = 'Create a new country';
$auth->add($createCountry);
// add "admin" role and give this role the "createCountry" permission
$adminRole = $auth->createRole('admin');
$auth->add($adminRole);
$auth->addChild($adminRole, $createCountry);
// Assign roles to user by id, make sure this is the user that you
// are using when testing
$auth->assign($adminRole, 1);
}
}
- Добавьте несколько журналов в свой контроллер, чтобы проверить, что работает не так, как ожидалось.
public function actionCreate()
{
// Logs just to find what is wrong, remove them later
if (($user = Yii::$app->user->identity) === null) {
Yii::debug('No user logged in, the problem is there', __METHOD__);
} else {
Yii::debug("User $user->id logged in", __METHOD__);
if (!Yii::$app->user->can('createCountry') {
Yii::debug('User cannot create country', __METHOD__);
if (!Yii::$app->user->can('admin') {
Yii::debug('User does not have admin role', __METHOD__);
} else {
Yii::debug('Admin role does not have createCountry child', __METHOD__);
}
} else {
Yii::debug('User can create country, ALL DONE!', __METHOD__);
}
}
// Remove above this line after finding the problem
// You would keep the logic below this line after finding the problem
if(!Yii::$app->user->can('createCountry')) {
throw new ForbiddenHttpException('You are not allowed to do that');
}
// No 'else' after throwing, more readable code
// Your logic goes here, the user can create countries
}
Ответ №2:
Я не уверен, но я думаю:
-
Ваш код почти в порядке
-
Отсутствует addChild($AdminRole, $createCountry);
-
Разрешение проверяется по таблице auth_item_child .
Parent Child admin 'createCountry' admin 'deleteCountry' guest 'indexCountry' ....
-
Тогда вы можете
if(Yii::$app->user->can('createCountry')){