[TUT] Sistema de autorização simples

[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/

Boa xará…

Pra quem ta iniciando como eu, vai ser de grande ajuda. :D

Ja vou tentar aplicar aqui.

Boa Gustavo, irá ajudar a muita gente. Parabéns pela iniciativa.

Sds,

:rolleyes:

Sucesso!!!!

Muito bom!!!