Как проверить доступ к определенным атрибутам модели в Yii?

Работая с фреймворком Yii, у меня возник вопрос, который я не могу решить самостоятельно.

Как я могу мило проверить доступ к определенным атрибутам модели?

Контекст:

  • Я использую RBAC, пользователь может иметь несколько ролей одновременно
  • У меня есть модель с кучей атрибутов (например, давайте назовем это профиль)
  • Некоторые атрибуты могут редактироваться любым зарегистрированным пользователем (email, age, favorite colorи т. д.), а некоторые — только пользователями с определенной ролью (is_banned — может быть изменен модератором или администратором, balance — могут быть изменены только администраторами и т. д.)

Что я уже сделал:
На данный момент я вижу только один возможный способ решения этой задачи:

function actionUpdate($id)
{
$model = Profile::model()->findByPk($id);

if (!$this->user->checkAccess('editProfile')) {
throw new AccessDeniedException();
}
if (isset($_POST['is_banned'])) {
if (!$this->user->checkAccess('toggleBan')) {
unset($_POST['is_banned']);
}
}
if (isset($_POST['balance'])) {
if (!$this->user->checkAccess('changeBalance')) {
unset($_POST['balance']);
}
}

$model->setAttributes($_POST);
$model->save();
}

Есть ли лучшие способы решить такую ​​задачу? Благодарю.

1

Решение

Рассмотрите возможность использования модельных сценариев (http://www.yiiframework.com/wiki/266/understanding-scenarios/):

  1. Добавьте условие сценария в правила вашей модели:

    правила публичных функций ()
    {
    возвращаемый массив (
    массив ('баланс', 'целое число', 'on' => 'admin'),
    );
    }
    
  2. Установите сценарий модели в контроллере:

    if ($ this-> user-> checkAccess ('admin')) {
    $ model-> script = 'admin';
    }
    

Теперь атрибуты, доступные по сценарию, сохраняются только.
Рассмотрим также использование сценариев в поисковых моделях.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]