Вопрос

Вот решил попробовать 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 - все работало.

Удалось найти решение.

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


public function init() {if(Yii::app()->user->role) Yii::app()->authManager->assign('wbadmin',Yii::app()->user->id);}

Нормально ли это? или есть какие то другие способы?

И еще вопрос: можно ли к пользователю привязать несколько ролей?


Yii::app()->authManager->save();

?

save - пишет в файл, а этого не требуется.

Я, конечно, могу ошибаться, но считаю, что таки требуется. Роли привязываются к юзеру по id. Далее, до авторизации он является гостем, а после авторизации - пользователем со своей ролью.

Если задача состоит в том, чтобы разрешить какие-то действия только зарегистрированным пользователям, то есть два способа:


if (!Yii::app()->user->isGuets)




public function accessRules()

{

   return Array(

       Array(  

          'allow',

          'users'=>Array('@')

       ),

       Array(

          'allow',

          'actions'=>Array('login','loginProccess'),

          'users'=>Array('*')

       ),

       Array(  

          'deny',

          'users'=>Array('*')

       ),

   );

}



Первый - проверить является ли пользователь гостем.

Второй - разрешить обращаться ко всем экшнам авторизованным пользователям (array(’@’)).

Ах да.

Ещё есть




'users'=>array('?')



Это, как раз неавторизованные, пользователи.

Но, в этом случае, создавать свои роли не нужно совсем.

В небольших проектах - это вполне нормально, а в больших, да еще и когда много разных пользователей, которые часто переходят из одного состояния в другое это не удобно, так как при 1000 пользователях и БД и Файл разрастутся - и операции с ролями и доступом будут давить на производительность.