[size="4"]Sistema de autorização simples[/size]
Como vi que perguntas sobre como fazer um sistema de autoreização simples (que não necessitam RBAC) surgem frequentemente aqui no forum, resolvi escrever um pequeno tutorial como referência.
Note que este tutorial cobre o grosso apenas, aqui eu presumo que você já tem noção de como fazer o sistema básico de login e usar o component ‘user’
Em meus projetos é assim que faço:
na tabela de usuários crio um campo do tipo ‘int’ chamado accessLevel que define o nivel de acesso de usuário
defina na sua config
'components'=>array(
'user'=>array(
'class'=>'WebUser',//manda usar a sua classe WebUser ao inves da padrao CWebUser
//...
),
),
na pasta components crie um arquivo chamado WebUser.php
class WebUser extends CWebUser{
private $_user;
function getIsSuperAdmin(){
return ( $this->user && $this->user->accessLevel === User::LEVEL_SUPERADMIN );
}
function getIsAdmin(){
return ( $this->user && $this->user->accessLevel >= User::LEVEL_ADMIN );
}
function getUser(){
if($this->isGuest)
return;
if($this->_user===null){
$this->_user=User::model()->findByPk($this->id);
}
return $this->_user;
}
}
para fazer validação de acesso no controller
function accessRules(){
return array(
//libera o acesso apenas para adminsitradores
array('allow',
'expression'=>'$user->isAdmin',
//a var 'user' dentro de uma expression do accessRules é uma referencia para Yii::app()->user
),
//nega para todos os outros
array('deny',
'users'=>array('*').
),
);
}
uso nas views
if(Yii::app()->user->isAdmin){
echo 'Bem vindo, administrador!';
}
if(Yii::app()->user->isSuperAdmin){
echo 'Você é o cara!';
}
Agora pra facilitar a representação dos dados de um campo ‘int’ , faça o seguinte
//model User
class User extends CActiveRecord{
//defina quantos levels necessitar
const LEVEL_REGISTERED=0,LEVEL_AUTHOR=1,LEVEL_ADMIN=6,LEVEL_SUPERADMIN=99;
//...
static function getAccessLevelList($level=null){
$levels=array(
self::LEVEL_REGISTERED=>'Registrado',
self::LEVEL_AUTHOR=>'Autor',
self::LEVEL_ADMIN=>'Administrador'
);
if($level===null)
return $levels;
return $levels[$level];
}
}
//uso em forms
$form->dropDownList($model,'accessLevel',$model->accessLevelList);
//uso em DetailView
$this->widget('zii.widgets.CDetailView',array(
'data'=>$model,
'attributes'=>array(
//...
array(
'name'=>'accessLevel',
'value'=>User::getAccessLevelList($model->accessLevel),
),
),
));
//imprimir label de administrador
echo User::getAccessLevelList(User::LEVEL_ADMIN);
É isso, espero que ajude
Abraços
EDIT:
depois de escrever esse tutorial resolvi escrever uma wiki baseado nele
É em ingles e contém mais informações do que este
aqui o link
http://www.yiiframework.com/wiki/276/simple-authorization-system/