Установить роль пользователю программно без 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.
Если это не ваша проблема, пожалуйста, предоставьте более подробную информацию о том, что вы пытаетесь и как выглядят ваши правила доступа.