Установить роль пользователю программно без RBAC?

Я не использую RBAC для проверки пользователей. Я не против использовать его, если это возможно, но я не думаю, что это так. Причина в том, что я использую REST API для проверки пользователей. У меня есть это в моей функции authenticate():

$API = new API();
$user = $API->getAccountDetailsByEmail($this->username);
if($user->password !== md5($this->password) ) {
   // Validated
}

Я хочу, чтобы на этом этапе пользователю также была назначена роль. Вот почему я попробовал следующее ниже:

$this->setState('roles', 'admin'); 

Но это не работает вообще. Я все еще получаю:

Error 403: You are not authorized to perform this action.

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

Я что-то упустил или есть простой способ назначить роль аутентифицированному пользователю?

2 ответа

CAccessControlFilter использует функцию CWebUser::checkAccess(). Эта функция вызывается с именем роли в качестве параметра. Если вы не хотите RBAC, то вы можете написать свой собственный производный класс CWebUser и реализовать свой собственный checkAccess.

Вы можете активировать этот класс в своем конфигурационном файле, добавив компонент "пользователь":

'components'=> array
(
    'user' => array
    (
        'class' => 'MyWebUser',
    ),
),

Например, вы можете установить список ролей в сеансе пользователя и проверить, есть ли у пользователя эта роль. Хотя я бы посоветовал не использовать сеанс для хранения ролей (база данных лучше), использование setState - определенно плохая идея. IIRC это устанавливает cookie на стороне пользователя, и немного изобретательный пользователь может выяснить, как злоупотреблять этим.

Если ваши правила действий

array('allow', 
  'actions'=>array(
    'myAction',
  ),
  'users'=>array('@'),
  'roles'=>array('admin'),
),

Затем измените их на:

array('allow', 
  'actions'=>array(
    'myAction',
  ),
  'users'=>array('@'),
  'expression'=>'$user->getState("roles")=="admin"',
),

Параметр role для правил действий предназначен ТОЛЬКО для использования с RBAC. Таким образом, вам нужно выполнить проверку по-другому, если вы не используете RBAC.

Если это не ваша проблема, пожалуйста, предоставьте более подробную информацию о том, что вы пытаетесь и как выглядят ваши правила доступа.

Другие вопросы по тегам