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 