Реализация правила Yii2 RBAC

Привет, ребята, я видел много уроков по Yii 2 RBAC, но я не могу оценить, как реализовать правила. В руководстве по Yii 2 они рассказали, как создаются правила, но не совсем, как это можно реализовать в поведении контроллера или где-то еще. Я действительно нуждаюсь в некотором просвещении относительно этого упомянутого вопроса.

Теперь у меня есть система загрузки документов, где у меня есть две роли, а именно администратор & кодировщик. По сути, роль администратора может делать все, в то время как роль кодировщика может только создавать, просматривать собственные, обновлять собственные и удалять собственные. Я уже создал правило с именем encodedBy.

Это мой код в моем EncoderRule

namespace app\rbac; use yii\rbac\Rule;

/**  * Checks if encoded_by matches user passed via params  */ class EncoderRule extends Rule {
public $name = 'encodedBy';

/**
* @param string|integer $user the user ID.
* @param Item $item the role or permission that this rule is associated with
* @param array $params parameters passed to ManagerInterface::checkAccess().
* @return boolean a value indicating whether the rule permits the role or permission it is associated with.
*/
public function execute($user, $item, $params)
{
return isset($params['document']) ? $params['document']->encoded_by == $user : false;
} }

Я храню данные в таблице «документ», где у меня есть поле с именем «encoded_by»
Я надеюсь, что вы, ребята, можете помочь мне в этом.
Большое спасибо!!!

9

Решение

Если я вас правильно понимаю, вы хотите использовать правило RBAC Yii2 для реализации некоторых разрешений для пользователей системы (администратора и кодировщика). Ну, это довольно просто в некоторой степени

В Yii2 для этого есть таблицы. Эти таблицы
я. auth_assignment
II. auth_item
III. auth_item_child
внутривенно auth_rule

Первое, что вам нужно сделать, это выбрать, какой authManager вы хотите использовать, либо PhpManager, либо DBManager, но я бы посоветовал вам использовать DBManager, потому что это то, что я использую.

Если вы используете шаблон Yii2 Basic, добавьте следующие строки кода в компоненты в web.php

'authManager' => [
'class' => 'yii\rbac\DbManager',
'defaultRoles' => ['guest'],
],

Если Yii2 Расширенный шаблон, добавьте строки кода ниже в компоненты в main.php в папке \ common \ config

Сделав вышеупомянутые шаги,

  • Запустите yii migrate —migrationPath = @ yii / rbac / migrations из командной строки

Приведенный выше код сгенерирует / создаст четыре таблицы, которые ранее были автоматически перечислены в базе данных для вас

Чтобы создать ваши правила RBAC.

Это требует создания разрешений и ролей.

Для базового шаблона

  • Создайте файл и назовите его RbacController.php в папке команд

Увидеть http://pastebin.com/RAKpZX2J чтобы увидеть, как это выглядит

Для расширенного шаблона,
— Создайте тот же файл, но вместо этого он будет находиться внутри console \ controllers \ RbacController.php

Сделав все это,

  • Run yii rbac / init // Это запустит actionInit () внутри файла RbacController

если вы успешно создали все сказанное выше, вы можете сделать что-то вроде этого, чтобы узнать, есть ли у пользователя разрешение

if(Yii::$app->user->can('createUser')){

}

Надеюсь, это поможет..

2

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

Я тоже борюсь с этим. Все, что я мог до сих пор выяснить, что $params['post'] абсолютно не работает для меня. Я понятия не имею, где-что я должен определить, чтобы это работало. Но что я мог понять по мотивам поста Джоэла Смолла, что, если я делаю это просто (я хочу просто запретить доступ к форме обновления в случае некоторых обстоятельств, касающихся состояния модели):

Приложение \ RBAC \ ZnwRule.php:

namespace app\rbac;

use yii\rbac\Rule;
use app\models\Znw;

class ZnwRule extends Rule {

public function execute($user, $item, $params) {
$znw = Znw::findOne(\Yii::$app->request->get('id'));
return $znw->created_by || $znw->zwz_id == 0 || !$znw->created_at ? false : true;
}
}

а затем в ZnwController:

public function actionUpdatezd($id) {
if (\Yii::$app->user->can('updatezd')) {
...
} else {
throw new \yii\web\ForbiddenHttpException('Sorry, you are not allowed to do that.');
}

Я определил в yii2-admin, что у меня есть правило:

имя: ZnwRule

класс: app \ rbac \ ZnwRule

и я создал разрешение называется updatezd:

имя: updatezd

правило: ZnwRule

Я запустил свое приложение с основным контроллером, где я проверяю, разрешен ли маршрут в yii2-admin для определенной роли, и все остальные контроллеры расширяют этот. Теперь, когда мне пришлось иметь дело с разрешений а также правила, Я должен был добавить маршрут также к разрешению.
Я уверен, что это может быть легче сделать, но, по крайней мере, пока это работает. Это немного, но я надеюсь, что это поможет в некоторой степени.

1

Если вам требуется простая проверка ролей, вы можете AccessRule класс для размещения новых ролей, не углубляясь в полноценный контроль доступа на основе ролей. Проверьте это руководство для получения полной информации: Упрощенная авторизация на основе ролей в Yii 2.0

Я обнаружил, что это самый простой способ понять, реализовать и поддерживать роли, однако вы упростите компромисс с обширной гибкостью, обеспечиваемой полным RBAC.

Полное раскрытие: я автор поста в блоге.

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