Controle de acesso

:blink: [color="#0000FF"]Olá pessoal!

Pessoal, alguém pode me ajudar com exemplos de como posso fazer um controle de usuário? Devo confessar que passei dias tentando e até agora nada, e não tenho nem ideia por onde começar…

[/color]

[color="#2F4F4F"]Estou aprendendo desenvolver através de um pequeno programinha através do Yii, mas por falta de conhecimento fico me batendo nesses encalces.

Queria fazer um controle de usuários baseado em permissões através de grupos, tipo Administrador, Supervisor, Visitante… e por aí vai.

Obrigado![/color]

se vc está fazendo sistema um pra aprender, recomendo não usar rbac

algo mais simples como o seguinte serve para 90% dos sistemas

tabela user




id

nome

...

permissao int(4)//inteiro pra busca e comparação ser mais rapida, e 4 pois vão caber permissões suficientes 2^4=16



controller




// fale par usar o filter accessControlFilter que é configurado no método accessRules

public function filters(){

 return array('accessControl'); 

}

public function accessRules(){

 return array(

  //da acesso pras ações criar e apagar para os usuários de permissão supervisor e administrador   

  array('allow',

   'actions'=>array('criar','apagar'),

   'expression'=>'$user->isAdmin() || $user->isSupervisor()'//$user nas expressões de acesso se referem à Yii::app()->user, que se refere à uma instancia de CWebUser

  ),

  //nega todo o resto que não se encaixou em nenhuma regra acima

  array('deny','users'=>array('*'))

 );

}



agora é necessário extender CWebUser para adicionar o métodos isSupervisor e isAdmin




//coloque em alguma pasta importada sempre, como a pasta components

class WebUser extends CWebUser{

 private $_user=false;//variavel para ser usada de cache da query

 public function isAdmin(){

   return ($this->getUser() && $this->getUser()->permissao===User:<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/tongue.gif' class='bbc_emoticon' alt=':P' />_ADMIN);

}

 public function isSupervisor(){

   return ($this->getUser() && $this->getUser()->permissao===User:<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/tongue.gif' class='bbc_emoticon' alt=':P' />_SUPERVISOR);

}

//método genérico que retorna a permissão do usuário

public function getPermissao(){

  return $this->getUser()->permissao;

 }

 public function getUser(){

  if($this->_user===false)

   $this->_user=User::model()->findByPk($this->id);

  return $this->_user;

 }

}



agora na model de user defina as constants usadas acimas pra saber qual a permissao correspondente no db(permissao no db é um int)




//user é a model que se refere à tabela que escrevi acima

class User extends CActiveRecord{

 const P_ADMIN=1, P_SUPERVISOR=2;


//adicione um método para ser chamado no form, no dropDownList

static function getPermissaoList($permissao=null){

 $permissoes=array(

  self:<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/tongue.gif' class='bbc_emoticon' alt=':P' />_ADMIN=>'Admnisitrador',

  self:<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/tongue.gif' class='bbc_emoticon' alt=':P' />_SUPERVISOR=>'Supervisor'

 );

 if($permissao===null)

   return $permissoes;

 return $permissoes[$permissao];

}

//agora nos forms você pode usar como o seguinte

//$form->dropDownList($model,'permissao',$model->permissaoList);

//e a qualquer hora que precisar imprimir qual a permissao use como

//echo User::getPermissaoList(Yii::app()->user->permissao);

}



agora fale para o Yii usar o seu WebUser ao invés do dele, definindo na config




return array(

...

'components'=>array(

  'user'=>array('class'=>'WebUser')

),

...

);



basicamente é isso

qualquer coisa pergunta

Obs: codigo não testado, escrevi tudo aqui respondendo o post

*Pelo tamanho da resposta isso ta mais pra uma wiki do que uma resposta :D

Completando o Gustavo, se vc vai usar RBAC e quer aprender, aconselho a instalar, ler a documentação e fuçar o código da extensão rights(http://www.yiiframework.com/extension/rights/)

Vai te dar um excelente conhecimento.

Obrigado!