Yii: выбор сценария в зависимости от операций в RBAC?

Подскажите пожалуйста, как быть в такой ситуации:

У меня есть несколько операций (changeUsername, changeRating, changeBanned), которые присваиваются определенным ролям.

В действии контроллера я проверяю роли
if (Yii::app()->user->checkAccess('changeUsername')) $model->setScenario('changeUsername');
if (Yii::app()->user->checkAccess('changeRating')) $model->setScenario('changeRating');
if (Yii::app()->user->checkAccess('changeBanned')) $model->setScenario('changeBanned');


Но как быть, если пользователю доступны сразу несколько операций? Назначать для каждой комбинации отдельный сценарий как-то не хочется, т.к. количество операций может увеличиваться.

Модель, как я понимаю, может иметь одновременно лишь один сценарий.


Вся проблема в том, что в AR-модели сохраняются только те поля, которые были обозначены в rules. В моем случае только некоторые роли могут изменять поля Username, Rating и Banned. А это значит, описывать их в rules я должен только для определенных сценариев.

Как быть в такой ситуации?
  • Вопрос задан
  • 5579 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Обычно сценарий задается в рамках какой-то бизнес логики, а не на основе прав пользователя. То бишь ваша проблема от того что вы пытаетесь сделать в одном действии 3 разных сценарий использования. Как минимум это не правильно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@balloon
Если Вам действительно нужна поддержка нескольких сценариев в одной форме, то имхо проще будет добавить поддержку такой фичи в нужной модели (или базовом классе).

По сути нужно переопределить метод getValidators() и добавить методы для формирования массива сценариев.
Ответ написан
@mihailkog
А не хотите для реализации RBAC в Yii посмотреть в сторону модуля Rights.
Ответ написан
Комментировать
XAKEPEHOK
@XAKEPEHOK Автор вопроса
Я только сегодня более ли менее разобрался с RBAC в Yii. Подскажите пожалуйста как мне поступить в такой ситуации. Есть модель Users, которая имеет поля Username, Password, Email, Rating, Banned, RealName, About.
Для редактирования профиля пользователя используется одна и та же форма, некоторые поля которой скрываются в зависимости от прав пользователя. Сам пользователь может менять только свои Password, Email, RealName и About. Пользователь с правами модератора может менять все те же поля + banned для любого пользователя системы. Ну а пользователь с правами администратора может менять вообще любые поля любого пользователя.
Все бы хорошо, но количество групп пользователей и их привилегий может меняться. Например, может появиться супер-модератор, который может менять все то же, что и модератор + Rating.
При отправки данных из формы модель AR сохраняет только те данные, которые прописаны в rules самой модели. ТО, что не прописано — игнорируется. Т.е. просто скрывать поля нельзя, т.к. подделать любой POST запрос легко. Здесь нужно колдовать со сценариями, но делать что-то типа
if (Yii::app()->user->checkAccess('changeUsername') && Yii::app()->user->checkAccess('changeRating')) $model->setScenario('changeUsernameRating');
if (Yii::app()->user->checkAccess('changeUsername') && Yii::app()->user->checkAccess('changeBanned')) $model->setScenario('changeUsernameBanned');

совсем не хочется, т.к. получается громоздкий и запутанный огород
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы