Ajuda Com Autorização

Olá.

Programava com o CakePhp, porém ultimamente tenho lido sobre o Yii e resolvi migrar.

Estou tendo duas dúvidas. Um é em relação a autorização depois da autenticação.

Fiz o login seguindo esse tutorial (que acredito que todos sigam):

http://www.yiiframework.com/doc/guide/1.1/en/topics.auth

Consegui fazer tranquilo.

Quando fui fazer a parte de requisição, veio a gambiarra (da qual estou querendo fugir).




public function accessRules()

	{

		return array(

			array('allow',

				'actions'=>array('login'),

				'users'=>array('*'), // Sempre permitir acessar a página de login

			),

			array('allow',

				'actions'=>array(),

				'users'=>array('@'), // Acessar todas as actions, desde que esteja autenticado

			),

			array('deny',

				'actions'=>array(),

				'users'=>array('*'), // Bloqueia tudo, caso não entre na regra de cima

			)

        );

	}



Poréém a parte do "@" não está funcionando. Ele sempre acaba indo pra parte de login.

Consegui resolver via gambiarra, porém não é essa minha intenção.

Resolvi fazendo um if:




if(Yii::app()->user->name == 'Guest') {

// Condição de só ir para login

} else {

// Condição de acessar tudo

}



Funcionou, porém quero resolver da maneira certa.

Minha segunda dúvida é:

No CakePhp eu tinha a classe AppController, onde eu podia definir uma variável que seria acessado por todo o site.

No caso do Yii eu quero fazer isso também, pois estou fazendo um sistema e não um site institucional. Começa com o Login e Senha. Como que eu defino uma variável do tipo Usuario que eu consiga acessar em todos os controllers?

Outro caso seria até mesmo para a autorização. Eu não quero criar esse método em todos os controllers (evitar o DRY) como faço para uma única autorização valer para todos?

Desde já agradeço.

Quando quero todos as actions numa rule normalmente não coloco:


'actions'=>array(),

Simplesmente:




array('allow',

    'actions'=>array(),

    'users'=>array('@'), // Acessar todas as actions, desde que esteja autenticado

),



Quanto a classe AppController, se você reparar o controllers gerados pelo Yii estedem a classe protected/components/Controller, ou seja, a pripriedades que você definir nela estarão disponíveis em todos os controllers.

Espero ter ajudado.

Boas,

Talvez algo como




....

array('allow',

  'actions'=>array('xpto', 'xpto2'),

  'users'=>array('@'),

  'expression'=>'Yii::app()->controller->isAllowed() == TRUE',

),

....



Depois na sua pasta Components você mete a classe Controller.php e pode colocar la dentro algo como:




public function isAllowed(){

  $current_id = Yii::app()->user->getId();


  current_user_admin = Roles::model->find(<condição para ver se o utilizador atual é ou nao do role x ou y>)


  if($current_user_admin){

    return TRUE;

  }else{

    return FALSE;

  }


}

Funcionou!

=D

Quanto aos componentes, como q eu faço para as variáveis serem enviadas para a view?

Pois precisarei de buscas no banco de dados no topo do site.