Передача параметров из behaviors контроллера в Rule

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Ответить
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Передача параметров из behaviors контроллера в Rule

Сообщение someweb »

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

/**
 * Checks if user can edit user or change user's role
 */
class RoleRule extends Rule
{
    public $name = 'canModifyUser';
    
    /**
     * @param string|int $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 bool a value indicating whether the rule permits the role or permission it is associated with.
     */
    public function execute($user, $item, $params)
    {
        Yii::trace($params['test'] ?? 'Params not set' , __CLASS__);
        return true;
    }
}
Создание правила

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

...
			$auth = Yii::$app->getAuthManager();
                        $authPermission = $auth->createPermission('editUsers');
                        $ruleObj = Yii::$container->get('\app\components\rbac\RoleRule');
                        $auth->add($ruleObj);
                        $authPermission->ruleName = $ruleObj->name;
                        $auth->add($authPermission);
...
Контроллер

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

            'access' => [
                'class' => AccessControl::className(),
                'only' => ['create', 'update', 'delete'],
                'rules' => [
                    [
                        'allow' => true,
                        'actions' => ['create', 'update'],
                        'roles' => ['editUsers'],
                        //Можно сделать, что бы работало как то так:
/*                       'params' => [
                           'test' => 'testParam',
                        ],
*/                        
                    ],
                ],
            ],
        ];
Есть простой способ передать params в Rule::execute из access?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Передача параметров из behaviors контроллера в Rule

Сообщение ElisDN »

Вручную:

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

'access' => [
    'class' => AccessControl::className(),
    'only' => ['create', 'update', 'delete'],
    'rules' => [
        [
            'allow' => true,
            'actions' => ['create', 'update'],
            'matchCallback' => function() {
                return Yii::$app->user->can('editUsers', ['test' => 'testParam']);
            },
        ],
    ],
],
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Передача параметров из behaviors контроллера в Rule

Сообщение someweb »

Ок, понятно. Спасибо!
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
vo_wonder
Сообщения: 19
Зарегистрирован: 2017.05.17, 20:57

Re: Передача параметров из behaviors контроллера в Rule

Сообщение vo_wonder »

ElisDN писал(а): 2017.03.09, 15:06 Вручную:

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

'access' => [
    'class' => AccessControl::className(),
    'only' => ['create', 'update', 'delete'],
    'rules' => [
        [
            'allow' => true,
            'actions' => ['create', 'update'],
            'matchCallback' => function() {
                return Yii::$app->user->can('editUsers', ['test' => 'testParam']);
            },
        ],
    ],
],
А как мне указать в поведении значение параметра 'test', если предполагается, что это - свойство модели?

Вот, например, действие View у меня описано так:

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

    public function actionView($id)
    {
        $model = $this->findModel($id);

        if (Yii::$app->user->can('manageOwnEditors', ['parent_id' => $model->parent_id])) {
            return $this->render('view', [
                'model' => $model,
            ]);
        }
    }
Как мне передать $model->parent_id?

Спасибо.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Передача параметров из behaviors контроллера в Rule

Сообщение ElisDN »

vo_wonder писал(а): 2017.07.05, 15:18 А как мне указать в поведении значение параметра 'test', если предполагается, что это - свойство модели?
Тогда не заморачивайтесь. Оставьте проверку в actionView.
Аватара пользователя
Zummer
Сообщения: 12
Зарегистрирован: 2014.01.17, 07:52
Откуда: Новосибирск
Контактная информация:

Re: Передача параметров из behaviors контроллера в Rule

Сообщение Zummer »

Вот то что тебе нужно. Так можно передать параметры для правила, и они (параметры) попадут в функцию execute.
https://www.yiiframework.com/doc/api/2. ... ams-detail

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

'rules' => [
    [
        'allow' => true,
        'actions' => ['update'],
        'roles' => ['updatePost'],
        'roleParams' => function($rule) {
            return ['post' => Post::findOne(Yii::$app->request->get('id'))];
        },
    ],
],
Ответить