RBAC и описание ролей в файле

Обсуждение документации. Переводы Cookbook и авторские рецепты.
dou
Сообщения: 5
Зарегистрирован: 2010.08.15, 11:56

Re: RBAC и описание ролей в файле

Сообщение dou »

Да, Вы правы. Это первое что я подумал, когда у меня не получилось получить описание роли находящееся в файле. Для этого придется сделать еще одну табличку в БД с ролями и описаниями к ним(для централизованного хранения и формирования списков ролей).
Получается что у нас есть описание ролей в файле и данные об этом в БД. Это дополнительные отношения в модели и дополнительные запросы к БД.
Я просто задался вопросом о целесообразности такого решения. Мне кажется поле description не зря определено при описании ролей в файле.
Может тогда проще реализовать RBAC через БД? Правда непонятно на сколько ))

Может я выбрал неверный путь решения своей задачи? Как Вы в своих проектах решаете вопрос об отображении ролей пользователей в админке и на сайте в целом? Как осуществляете создание списка ролей при описании их в файле? Используете ли Вы имена ролей или их описания?
Спасибо!

Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: RBAC и описание ролей в файле

Сообщение timlar »

В таком случае, лучше использовать полноценный CDbAuthManager: http://www.yiiframework.com/doc/api/CDbAuthManager
Twitter: @timlar_ua

R3D3
Сообщения: 352
Зарегистрирован: 2010.04.11, 14:52

Re: RBAC и описание ролей в файле

Сообщение R3D3 »

Возникли следующие вопросы:

Требуется сделать возможность назначать сразу несколько ролей одному пользователю. Для проверки обладания пользователем роли существует php код в каждом случае. Будет ли лучшем решением засунуть этот код в bizRule ?
В каком месте кода используется это bizRule для проверки? Его использует класс PHPAuthManager или же фильтр accessControl ?


Чем тогда отличается проверка роли таким способом от проверки в WebUser::checkAccess($operation, $params) ?
Также непонятна следующая ситуация:
в мануалах и судя по названию параметра метод checkAccess проверяет возможность пользователя совершить ту или иную операцию $operation.

Но если использовать вот такое правило:

Код: Выделить всё

public function accessRules()
    {
        return array(
            array('allow', 
                'roles'=>array('admin'),
                                   )
);     
}
 
и при этом определить следующий метод в WebUser

Код: Выделить всё

function checkAccess($operation, $params=array())
    {
        print_r($operation);
        print_r($params);
        die();
    }
 
То при обращении к соотв. контроллеру скрипт умрет с надписью admin. Выходит, что WebUser::checkAccess проверяет не операцию, а роль?
В документации об этом написано достаточно мутно.

Также вопрос, можно ли методом CPhpAuthManager::assign() привязать более чем 1 роль к пользователю ?

P.S. Обнаружил что у класса CPhpAuthManager так же как и у CWebUser есть метод checkAccess, и окончательно запутался :D В каком случае что вызывается?
Yii Jabber Conference: yii@conference.jabber.ru

Аватара пользователя
samdark
Администратор
Сообщения: 9420
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: RBAC и описание ролей в файле

Сообщение samdark »

Требуется сделать возможность назначать сразу несколько ролей одному пользователю. Для проверки обладания пользователем роли существует php код в каждом случае. Будет ли лучшем решением засунуть этот код в bizRule ?
Зависит от ситуации.
В каком месте кода используется это bizRule для проверки? Его использует класс PHPAuthManager или же фильтр accessControl ?
Используется так:

Код: Выделить всё

Yii::app()->user->checkAccess('role', array('bizrule_params'));
 
В accessControl не используется.
Чем тогда отличается проверка роли таким способом от проверки в WebUser::checkAccess($operation, $params) ?
Ничем это она и есть.
То при обращении к соотв. контроллеру скрипт умрет с надписью admin.
Все сущности в RBAC по сути равны и различаются исключительно на уровне описания и восприятия.
Также вопрос, можно ли методом CPhpAuthManager::assign() привязать более чем 1 роль к пользователю ?
Да.
P.S. Обнаружил что у класса CPhpAuthManager так же как и у CWebUser есть метод checkAccess, и окончательно запутался В каком случае что вызывается?
Обычно используется метод CWebUser, который вроде использовал метод AuthManager.

R3D3
Сообщения: 352
Зарегистрирован: 2010.04.11, 14:52

Re: RBAC и описание ролей в файле

Сообщение R3D3 »

Спасибо, кажется разобрался.

Удалось выяснить следующие вещи:

1. Если у WebUser есть метод checkAccess, то вызывается он. Если нету, то вызывается PhpAuthManager::checkAccess.
2. Если bizRule написать синтаксически неправильно, то вопреки ожиданиям скрипт не будет падать :) Такое правило просто не пройдет проверку.
Yii Jabber Conference: yii@conference.jabber.ru

Аватара пользователя
samdark
Администратор
Сообщения: 9420
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: RBAC и описание ролей в файле

Сообщение samdark »

Можно, чтобы соответствовало ожиданиям: http://yiiframework.ru/doc/cookbook/ru/core.development

Tungsten
Сообщения: 8
Зарегистрирован: 2010.11.18, 14:38

Re: RBAC и описание ролей в файле

Сообщение Tungsten »

Скажите, пожалуйста, как происходит привязка роли к пользователю и каким образом authManager знает какая роль (или роли?) есть у пользователя?

Моё предположение:
1 - после определённого действия пользователя (регистрация, оплата за доп. сервис, присоединение в группу) в бд формируется дополнительная привязка между пользователем и соответствующей ролью/правилом
2 - при логине юзера, CWebUser (или authManager?) автоматически подтягивает роль (роли?).

Так ли это? Если да, то есть ли встроенные средства Yii для этого (динамическая привязка роли и сохранение этого в бд)?

Спасибо.

Аватара пользователя
samdark
Администратор
Сообщения: 9420
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: RBAC и описание ролей в файле

Сообщение samdark »

Да, так. Да, есть. В официальном гайде есть пример кода. Только там не делается save().

Fredo
Сообщения: 9
Зарегистрирован: 2010.12.03, 21:25

Re: RBAC и описание ролей в файле

Сообщение Fredo »

Всем привет!
Кто может подсказать, нужно ли делать отмену ролей пользователя при выходе?
А то меня вот этот пример с толку сбил http://www.yiiframework.com/wiki/65/how ... -php-file/.
Там как раз делается revoke при logout.

Аватара пользователя
samdark
Администратор
Сообщения: 9420
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: RBAC и описание ролей в файле

Сообщение samdark »

Нет, не нужно. Там довольно странный рецепт.

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: RBAC и описание ролей в файле

Сообщение Ekstazi »

И, кстати, накрывается когда много пользователей online. :)

Fredo
Сообщения: 9
Зарегистрирован: 2010.12.03, 21:25

Re: RBAC и описание ролей в файле

Сообщение Fredo »

Спасибо за ответ.

ikarushka
Сообщения: 39
Зарегистрирован: 2010.11.23, 15:49

Re: RBAC и описание ролей в файле

Сообщение ikarushka »

Сразу извиняюсь за глупые вопросы, только начал разбираться с Yii.

1) Для того чтобы роль из БД была доступна в Yii::app()->user->role. Не стал расширять CWebUser как описано в рецепте. А в UserIdentity.php сделал так:

Код: Выделить всё

$this->setState('role', $user->role);
Все работает, но правильно ли так делать?

2)Код описание ролей auth.php, не могу въехать как в нем описать содержание роли (те действия. которые возможны в рамках какой-либо роли).
Покажите, пожалуйста, кусок рабочего кода описание ролей с операциями и задачами.

Аватара пользователя
samdark
Администратор
Сообщения: 9420
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: RBAC и описание ролей в файле

Сообщение samdark »

1) Нормально, но роль не будет меняться пока юзер не перелогинится.
2) Посмотрите первые страницы темы.

ikarushka
Сообщения: 39
Зарегистрирован: 2010.11.23, 15:49

Re: RBAC и описание ролей в файле

Сообщение ikarushka »

1) Понятно, мне как раз так и надо.
2) В этой теме примера не нашел. Но зато нашел ответ здесь: viewtopic.php?f=3&t=172&start=20#p3198
Sam Dark спасибо за толковый рецепт.

Аватара пользователя
Sentox
Сообщения: 18
Зарегистрирован: 2010.12.22, 14:26

Re: RBAC и описание ролей в файле

Сообщение Sentox »

Не могу понять почему в настройках всё прописано, с переопределением классов WebUser и PhpAuthManager

Код: Выделить всё

 'components' => array(
        'user' => array(
            'class' => 'WebUser',
            // enable cookie-based authentication
            //'allowAutoLogin' => true,
        ),
        'authManager' => array(
            //'class' => 'CPhpAuthManager',
            'class' => 'PhpAuthManager',
            // Роль по умолчанию. Все, кто не админы, модераторы и юзеры — гости.
            'defaultRoles' => array('guest'),
        ), 
а сами классы как будто и не включаются. При попытке вызвать выход Yii::app()->end(); в любом из классов ничего не происходит ни при каких переходах.
Файлы с классами существуют и лежат в папке components.
Подскажите пожалуйста в каком направлении отлаживать код, не могу даже предположить.
Кстати при выводе в контроллере UsersController в методе

Код: Выделить всё

public function accessRules()
    { var_dump(Yii::app()->user->role);Yii::app()->end();
        return array(
            array('allow', // allow all users to perform 'index' and 'view' actions
                'actions' => array('index', 'view'),
                'users' => array('*'), 
в Yii::app()->user->role находится объект модели Users, так и должно быть?
Есть ли возможность что в Yii::app()->user->role находится модель Users?
...

Аватара пользователя
Sentox
Сообщения: 18
Зарегистрирован: 2010.12.22, 14:26

Re: RBAC и описание ролей в файле

Сообщение Sentox »

PhpAuthManager класс вызывается только после в случае использования
Yii::app()->user->checkAccess('administrator'))
Получается что при вызове public function accessRules() ничего не происходит?
...

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: RBAC и описание ролей в файле

Сообщение Ekstazi »

Происходит, но после вызова accessRules фильтр accessControl сам обращается по необходимости к checkAccess

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: RBAC и описание ролей в файле

Сообщение slavcodev »

Перечитывая тему, решив сделать что-то более переносимое из проекта в другой, задался вопросом.
Почему аутентификация вызывается из модели, вызывая UserIdentify::authentication(), который в свою очередь снова создает модель и сравнивает данные.
Совсем не гибко. Получается, если вдруг мы захотим поменять логику модели, нам (или тот кто будет после нас поддерживать проект) придется помнить что срочно нужно менять и компонент.
Например хочу поменять поле в таблице с login, на username, или не хочу больше по логину авторизоваться, а хочу по емайлу или еще более частый случай, захочу поменять метод шифрования пароля.
Все три случая потребуют лезть как в модель, так и в UserIdentity.
Сразу вспомнил про валидацию моделей, что ее просто так придумали.

Предлагаю обсудить следующие изменения в рецепте:
protected/components/UserIdentity.php:

Код: Выделить всё

class UserIdentity extends CBaseUserIdentity {
    private $_model;
    public function __construct($model) {
        if(is_string($model))
            $model=new $model;
        $this->_model=$model;
    }
    public function authenticate() {
        // Устанавливаем сценарий 'login' и проверяем модель
        $this->_model->setScenario('login');
        return $this->_model->validate();
    }
    public function getId() {
        return $this->_model->getId();
    }
    public function getName() {
        return $this->_model->getName();
    }
} 
модель User:

Код: Выделить всё

class User extends CActiveRecord {
    public function tableName(){
        return 'User';
    }
 
    protected function beforeValidate(){
        $this->password = md5($this->password);
        return parent::beforeValidate();
    }

    public function rules()
    {
        return array(
            // login & password обязательны
            array('login, password', 'required'),

            // проверим существует ли пользователь с заданным логином и паролем
            // шифровать не нужно, мы его шифруем в beforeValidation()
            array('login','exist','on'=>'login','criteria'=>array('condition'=>'`password`==:pass','params'=>array(':pass'=>$this->password))),
        );
    }
} 
Ну вот как-то так. Теперь любое изменение в логике с пользователями не затронет другие компоненты.
Методами User::getId() и User::getName() регулируем что будем использовать за имя и ид авторизированого пользователя.

Что думаете по этому поводу?
Жду Yii 3!

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: RBAC и описание ролей в файле

Сообщение Ekstazi »

Думаю, что идею надо дооформить и она неплохо дополнит рецепт :)

Ответить