Как показать 2 экшина Гостям?

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Ответить
alexnew2000
Сообщения: 104
Зарегистрирован: 2015.10.04, 09:47

Как показать 2 экшина Гостям?

Сообщение alexnew2000 » 2016.11.27, 21:51

Добрый вечер (утро). Не получается открыть гостям правило articleRead (экшины index и view)
Настроил rbac по инструкции http://krivochenko.ru/blog/post/rbac-in-yii2-users

проверка $item->name=='articleRead' в IsAuthorRule срабатывает и даёт true, но не открывает доступ. Как быть?

Код: Выделить всё

class IsAuthorRule extends Rule
{
    public $name = 'isAuthorRule';
    public function execute($user, $item, $params)
    {
        
        if($item->name=='articleRead'){
        //    echo 22222;
            return true;
        }
         
        
        if (!isset($params['article'])) {
            //return false;
            return true;
        }
        return ($params['article']->author_id == $user);
    }
}
контроллер

Код: Выделить всё

class ReshenieController extends Controller
{
     private $_model = false;
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        
     return [
        'access' => [
            'class' => AccessControl::className(),
            'only' => ['index', 'create', 'view', 'update', 'delete'],
            'rules' => [
               [
                    'allow' => true,
                    'actions' => ['index'],
                    'roles' => ['articleRead'],
                ],
                [
                    'allow' => true,
                    'actions' => ['create'],
                    'roles' => ['articleCreate'],
                ],
                [
                    'allow' => true,
                    'actions' => ['view'],
                    'roles' => ['articleRead'],
                ],
                [
                    'allow' => true,
                    'actions' => ['update'],
                    'matchCallback' => function ($rule, $action) {
                        return Yii::$app->user->can('articleUpdate', ['article' => $this->findModel(Yii::$app->request->get('id'))]);
                    }
                ],
                [
                    'allow' => true,
                    'actions' => ['delete'],
                    'matchCallback' => function ($rule, $action) {
                        return Yii::$app->user->can('articleDelete', ['article' => $this->findModel(Yii::$app->request->get('id'))]);
                    }
                ],
            ],
        ],
    ];    


Аватара пользователя
yiijeka
Сообщения: 3068
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Как показать 2 экшина Гостям?

Сообщение yiijeka » 2016.11.28, 10:48

'roles' => ['articleRead'],

Так тут не проверяется правило IsAuthorRule, надо также использовать matchCallback, чтобы передать параметр 'article' для проверки.

alexnew2000
Сообщения: 104
Зарегистрирован: 2015.10.04, 09:47

Re: Как показать 2 экшина Гостям?

Сообщение alexnew2000 » 2016.11.28, 20:19

yiijeka писал(а):'roles' => ['articleRead'],

Так тут не проверяется правило IsAuthorRule, надо также использовать matchCallback, чтобы передать параметр 'article' для проверки.
Спасибо)) получилось

Код: Выделить всё

 [
                    'allow' => true,
                    'actions' => ['index'],
                    'matchCallback' => function ($rule, $action) {                        
             
                        return Yii::$app->user->can('articleRead', ['article' => 0]);
                    }
                ],
код Yii::$app->request->get('id') был явно лишним.
можно было и так, тоже результат.

Код: Выделить всё

 [
                    'allow' => true,
                    'actions' => ['index'],
                    'matchCallback' => function ($rule, $action) {                
                        return true;
                    }
                ],

В первом коде передается параметр в класс наследник Rule а во втором мы сразу фигачим решение в келбек.

Ответить