Привет, ребята, я видел много уроков по 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»
Я надеюсь, что вы, ребята, можете помочь мне в этом.
Большое спасибо!!!
Если я вас правильно понимаю, вы хотите использовать правило 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
Сделав вышеупомянутые шаги,
Приведенный выше код сгенерирует / создаст четыре таблицы, которые ранее были автоматически перечислены в базе данных для вас
Чтобы создать ваши правила RBAC.
Это требует создания разрешений и ролей.
Для базового шаблона
Увидеть http://pastebin.com/RAKpZX2J чтобы увидеть, как это выглядит
Для расширенного шаблона,
— Создайте тот же файл, но вместо этого он будет находиться внутри console \ controllers \ RbacController.php
Сделав все это,
если вы успешно создали все сказанное выше, вы можете сделать что-то вроде этого, чтобы узнать, есть ли у пользователя разрешение
if(Yii::$app->user->can('createUser')){
}
Надеюсь, это поможет..
Я тоже борюсь с этим. Все, что я мог до сих пор выяснить, что $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 для определенной роли, и все остальные контроллеры расширяют этот. Теперь, когда мне пришлось иметь дело с разрешений а также правила, Я должен был добавить маршрут также к разрешению.
Я уверен, что это может быть легче сделать, но, по крайней мере, пока это работает. Это немного, но я надеюсь, что это поможет в некоторой степени.
Если вам требуется простая проверка ролей, вы можете AccessRule
класс для размещения новых ролей, не углубляясь в полноценный контроль доступа на основе ролей. Проверьте это руководство для получения полной информации: Упрощенная авторизация на основе ролей в Yii 2.0
Я обнаружил, что это самый простой способ понять, реализовать и поддерживать роли, однако вы упростите компромисс с обширной гибкостью, обеспечиваемой полным RBAC.
Полное раскрытие: я автор поста в блоге.