RBAC и Scenario

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Закрыто
Аватара пользователя
XAKEPEHOK
Сообщения: 38
Зарегистрирован: 2012.08.16, 13:11
Откуда: КМВ
Контактная информация:

RBAC и Scenario

Сообщение XAKEPEHOK »

Подскажите пожалуйста, как быть в такой ситуации:
У меня есть несколько операций (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 я должен только для определенных сценариев.
Как быть в такой ситуации?
Большинство неправильных шагов совершаются стоя на месте
Аватара пользователя
XAKEPEHOK
Сообщения: 38
Зарегистрирован: 2012.08.16, 13:11
Откуда: КМВ
Контактная информация:

Re: RBAC и Scenario

Сообщение XAKEPEHOK »

На всякий случай уточню вопрос. Есть модель 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'); 
Но городить такой громоздкий огород как-то не правильно. Подскажите пожалуйста, как лучше быть в данной ситуации?
Большинство неправильных шагов совершаются стоя на месте
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: RBAC и Scenario

Сообщение lancecoder »

вам надо creatValidators пересмотреть и генерить его динамически, в зависимости от роли
Аватара пользователя
XAKEPEHOK
Сообщения: 38
Зарегистрирован: 2012.08.16, 13:11
Откуда: КМВ
Контактная информация:

Re: RBAC и Scenario

Сообщение XAKEPEHOK »

lancecoder писал(а):вам надо creatValidators пересмотреть и генерить его динамически, в зависимости от роли
Извините, но я вас не понял. Что вы имеете ввиду? Мне свой валидатор надо писать? Не пойму зачем. Или вы имеете ввиду написать валидатор, который в самой модели будет проверять доступные операции?
Большинство неправильных шагов совершаются стоя на месте
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: RBAC и Scenario

Сообщение lancecoder »

при создании модели происходит считывание в вышеупомянутой функции правил валидации, вам как я понял в зависимости от того юзер это или админ или модер нужно давать определенные разрешения.
return array(
array('ban'=>...checkAccess(__CLASS__.'ban')?'safe':'unsafe')
)
Аватара пользователя
XAKEPEHOK
Сообщения: 38
Зарегистрирован: 2012.08.16, 13:11
Откуда: КМВ
Контактная информация:

Re: RBAC и Scenario

Сообщение XAKEPEHOK »

Спасибо за ответ. Но я все же решил разбить эту задачу на несколько разных действий, тем самым решив проблему. Изначальный подход, который я выбрал, при более детальном рассмотрении наоборот нагромождал код.
Большинство неправильных шагов совершаются стоя на месте
Закрыто