Есть табличка user_driver . В ней есть статус поле status. Sami водители могут быть заплокировани установкой статуса в этой таблице. Есть уже рабочий RBAC с ролями.
Как сделать чтобы проверка была на то, что это заблокировании водитель и делать редирект ('/login') если это условие выполняется
Пока только идея есть в beforeAction проверять что за роль у человека и смотреть поле status у него . Можно ли перенести это дело в AccessControl ?
Подскажите как лучше сделать ограничение доступа
-
- Сообщения: 401
- Зарегистрирован: 2011.11.01, 17:29
Re: Подскажите как лучше сделать ограничение доступа
AccessControl сам ничего не редиректит, он может только исключение вызвать и отобразить "Доступ запрещён".
Как можно реализовать:
1. Создать роль "activeDriver", привязать к ней правило для проверки водителя.
Правило:
Создаём роль, привязываем правило. Можно сделать вручную через админку, либо таким кодом в консольном контроллере.
2. Указываем роль в списке доступа к экшену.
3. Добавляем редирект для всех, кому запрещён доступ:
Примерно так.
Как можно реализовать:
1. Создать роль "activeDriver", привязать к ней правило для проверки водителя.
Правило:
Код: Выделить всё
class ActiveDriverRule extends Rule
{
public $name = 'isActiveDriver';
public function execute($user, $item, $params)
{
if (empty($user)) {
return false;
}
return $user->userDriver->status === 'goodStatus';
}
}
Код: Выделить всё
$auth = Yii::$app->authManager;
// Создаём правило "isActiveDriver".
$isActiveDriver = new ActiveDriverRule();
$auth->add($isActiveDriver);
// Добавляем роль "activeDriver", прикрепляем к ней правило для проверки.
$activeDriver = $auth->createRole('activeDriver');
$activeDriver->description = 'Незаблокированный водитель';
$activeDriver->ruleName = $isActiveDriver->name;
$auth->add($activeDriver);
Код: Выделить всё
[
'allow' => true,
'actions' => ['bla-bla-bla'],
'roles' => ['activeDriver'],
],
Код: Выделить всё
'denyCallback' => function($rule, $action) {
return $action->controller->redirect('user/login');
},
-
- Сообщения: 401
- Зарегистрирован: 2011.11.01, 17:29
Re: Подскажите как лучше сделать ограничение доступа
У меня RBAC через базу данных. Роль и правило создал .
Rule:
Controller:
Других правил нет.
Forbidden (#403) .
Не могу понять почему не срабатывает правило return (($user_entity->driverInfo->status) == DriversInfo::ACTIVE);
Не срабатывает
Rule:
Код: Выделить всё
<?php
namespace budyaga\users\rbac;
use backend\models\DriversInfo;
use budyaga\users\models\User;
use Yii;
use yii\rbac\Rule;
class ActiveDriverRule extends Rule
{
public $name = 'isActiveDriver';
public function execute($user, $item, $params)
{
if (empty($user)) {
return false;
}
$user_entity = User::findOne($user);
Yii::warning($user_entity->driverInfo->status); // 5
return (($user_entity->driverInfo->status) == DriversInfo::ACTIVE); // 5==5
}
}
?>
Код: Выделить всё
public function behaviors() {
return [
UserInfo::className(), // Proverka na mail i pomeshcenie v header nujnoi infi
'access' => [
'class' => AccessControl::className(),
'only' => ['profile', 'register-driver', 'step-one-driver-signup'],
'rules' => [
[
'actions'=> ['profile'],
'allow' => true,
'roles' => ['activeDriver'],
'denyCallback' => function ($rule, $action) {
Yii::$app->session->setFlash('login_first', 'ggg'); // govorim chto bi dlya nachalo zaloginilis bi
// return $this->redirect('/login');
return $action->controller->redirect('/login');
}
],
],
],
Forbidden (#403) .
Не могу понять почему не срабатывает правило return (($user_entity->driverInfo->status) == DriversInfo::ACTIVE);
Код: Выделить всё
return $action->controller->redirect('/login');
Re: Подскажите как лучше сделать ограничение доступа
Забыл кое-что добавить. Чтобы проверка выполнялась, добавьте роль в список ролей по умолчанию.
Код: Выделить всё
'components' => [
'authManager' => [
'class' => 'yii\rbac\DbManager',
'defaultRoles' => ['activeDriver'],
],
-
- Сообщения: 401
- Зарегистрирован: 2011.11.01, 17:29
Re: Подскажите как лучше сделать ограничение доступа
Роль заработало , а вот редирект так и не срабатывает . .. Пробью по разному но результат тот жеNex-Otaku писал(а): ↑2018.02.25, 14:33 Забыл кое-что добавить. Чтобы проверка выполнялась, добавьте роль в список ролей по умолчанию.
Код: Выделить всё
'components' => [ 'authManager' => [ 'class' => 'yii\rbac\DbManager', 'defaultRoles' => ['activeDriver'], ],
denyCallback срабатывает только для запрещающих правил (для тех у которых параметр allow выставлен в false), у Вас же разрешающее правило