Вопрос, по поводу ролей

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
savage
Сообщения: 4
Зарегистрирован: 2009.10.22, 21:07

Вопрос, по поводу ролей

Сообщение savage »

Вынужден продублировать свой вопрос, так как ломаю весь день голову и не могу понять в чем проблема.
Вот решил попробовать Yii . На практике решил сделать cms`ку для сайта. Возникла такая проблема:
Использую CPhpAuthManages. При этом все страницы у админки наследуются от контроллера в котором прописано:

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

public function filters()
{
        return Array(
                        'accessControl',
                    );
    }

    public function accessRules()
    {
        return Array(
                        Array(    
                                'allow',
                                'roles'=>Array('admin')
                            ),
                        Array(
                                'allow',
                                'actions'=>Array('login','loginProccess'),
                                'users'=>Array('*')
                            ),
                        Array(    
                                'deny',
                                'users'=>Array('*')
                            ),
                    );
    } 
Создал файл auth.php где надо:

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

return array(
    'admin' => array(
        'type' => CAuthItem::TYPE_ROLE,
        'description' => 'Администратор' 
    )
); 
Т.е. как я прочитал из документации, таким образом я запретил все действия (кроме login, loginProccess) для пользователей не имеющих роль admin.
В настройках поставил loginUrl = /admin/login/
Все это работает.
Теперь пользователь может вводит логин и пароль, если они введены корректно, то проходит присвоение роли admin:

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

Yii::app()->authManager->assign('admin',Yii::app()->user->id); 
Но вот после этого, перейдя например на адрес /admin/login/ на экран вываливается сообщение о том что у меня недостаточно прав для выполнения действия. Вопрос: в чем проблема может быть?
При этом, до этого я пробовал использовать CDbAuthManager - все работало.
Аватара пользователя
Igor
Сообщения: 5
Зарегистрирован: 2009.10.19, 01:38
Откуда: Украина -> Львов
Контактная информация:

Re: Вопрос, по поводу ролей

Сообщение Igor »

У вас тут опечатка:

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

Array(   
                        '[b]dany[/b]', // <== Должно быть [b]deny[/b]
                        'users'=>Array('*')
                     ), 
Какую версию фреймворка вы используете? Как я понимаю - последние версии дадут ошибку на этом коде:

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

    return array(
        'admin' => array(
            'type' => CAuthItem::TYPE_ROLE,
            'description' => 'Администратор'
        )
    ); 
Сейчас требуется указывать все параметры для массива. То есть так:

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

return array(
        'admin' => array(
            'type' => CAuthItem::TYPE_ROLE,
            'description' => 'Администратор',
            'bizRule' => NULL,
            'data' => NULL,
        )
);
 
Хотя то, что при CDbAuthManager все работало не дает расслабиться...
Попробуйте проверить Yii::app()->authManager->assign метод на каком-нибудь тестовом, простом контроллере, работает?
Vadim
Сообщения: 9
Зарегистрирован: 2009.09.26, 13:42

Re: Вопрос, по поводу ролей

Сообщение Vadim »

В одной из тем тут это было обсуждено - если использовать роли на основе пхп конфигурации, то при вызове assign они никуда не сохраняются и действуют только в течении запроса. Выхода тут два - вызывать сохранение файла конфигурации ролей (есть соотвествующий метод), при котором auth.php переписывается, либо хранить в базе роль, потом ставить ее в сессию и на основе этого при каждом вызове котроллера (или из базового класса контроллеров) ее назначать.
Читай также: http://www.yiiframework.ru/doc/cookbook ... .rbac.file
savage
Сообщения: 4
Зарегистрирован: 2009.10.22, 21:07

Re: Вопрос, по поводу ролей

Сообщение savage »

У вас тут опечатка:
Упс... поправил - но это не дало результата
Какую версию фреймворка вы используете? Как я понимаю - последние версии дадут ошибку на этом коде:
Пользую версию 1.0.10, в файле auth.php поправил (добавил все поля) - это тоже не помогло.
В одной из тем тут это было обсуждено - если использовать роли на основе пхп конфигурации, то при вызове assign они никуда не сохраняются и действуют только в течении запроса. Выхода тут два - вызывать сохранение файла конфигурации ролей (есть соотвествующий метод), при котором auth.php переписывается, либо хранить в базе роль, потом ставить ее в сессию и на основе этого при каждом вызове котроллера (или из базового класса контроллеров) ее назначать.
мда.... что же делать. Я именно по этому и отказался от CDbAuthManager, так как он при каждом assign писал в в таблицу связей пользователя и роль - не понятно зачем это. Я думал что CPhpAuthManager хранит в сессии пользователя сведения о ролях - а тут выходит что и не хранит вовсе. Как же тогда работать с этим. Если использовать CDbAuthManager - это же совсем не удобно, а если на сайте будет 1000 пользователей - это тысяча запросов - по сти бесполезных.
savage
Сообщения: 4
Зарегистрирован: 2009.10.22, 21:07

Re: Вопрос, по поводу ролей

Сообщение savage »

В общем, в чем то я разобрался. Меня вводило в заблуждение то что я думал что система сохраняет в сессии привязку к ролям и акссес менеджеру.
Проблему решил так: при успешной авторизации добавляю пользователю свойство role, а затем в контроллере переопределяю функцию init, в которой привязываю роль к пользователю, выглядит примерно так:

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

public function init() {
    if(Yii::app()->user->role)
        Yii::app()->authManager->assign(Yii::app()->user->role, Yii::app()->user->id);
} 
Так нормально? или это не есть правильно и можно как то решить эту проблему более красивее.
И еще, тогда такой вопрос: можно ли к пользователю привязать несколько ролей?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Вопрос, по поводу ролей

Сообщение samdark »

Так вполне неплохо. Раньше именно этот способ использовался в рецепте:
http://yiiframework.ru/doc/cookbook/ru/access.rbac.file

Назначить несколько ролей можно, но лично у меня необходимости не было т.к. роли можно наследовать в конфигурации:

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

'guest' => array(
  'type' => CAuthItem::TYPE_ROLE,
  'description' => 'Guest',
  'children' => array(
    'showPage',      // просмотр статических страниц
  )
),
'user' => array(
  'type' => CAuthItem::TYPE_ROLE,
  'description' => 'User',
  'children' => array(
    'guest',         // отнаследуемся от гостя
    'useSearch',
  ),
),
 
savage
Сообщения: 4
Зарегистрирован: 2009.10.22, 21:07

Re: Вопрос, по поводу ролей

Сообщение savage »

Спасибо!
haiflive
Сообщения: 38
Зарегистрирован: 2010.02.10, 09:32

Re: Вопрос, по поводу ролей

Сообщение haiflive »

Подскажите пожалуйста, как одному пользователю дать все возможные права доступа?.

Вобщем этого самого пользователя я вшил в скрипты, и создать его можно только изменив сам код.. так называемый "супер пользователь", но как дать права супер пользоателю не наследуясь от других ролей и операций?.
"*" - не помогает..

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

Re: Вопрос, по поводу ролей

Сообщение samdark »

Почему «не наследуясь от других ролей и операций»? Это самый логичный путь решения.
haiflive
Сообщения: 38
Зарегистрирован: 2010.02.10, 09:32

Re: Вопрос, по поводу ролей

Сообщение haiflive »

Расчитывается что это будет супер пользователь..
И так же права будут распределяться с помощью самого пользователя, вот и требуется один... ..
..эээ я тут подумал, что-то я лишнее придумал.. ладно всем спасибо..
Ответить