之前用过一个Yii的扩展srbac
很强大,现在主要介绍一下Yii自带的权限控制的实现
- 在controller中添加过滤器和过滤规则
/**
* @return array action filters
*/
public function filters()
{
return array(
'accessControl', // perform access control for CRUD operations
//array(
//'COutputCache + view'//表示对view这个action起作用,
//'duration'=>100,
//'varyByParam'=>array('id'),
//),
);
}
/**
* Specifies the access control rules.
* This method is used by the 'accessControl' filter.
* @return array access control rules
*/
public function accessRules()
{
return array(
array('deny', // allow authenticated users to access all actions
'actions'=>array('onlyadmin'),
'roles'=>array('user')
),
);
}
- 在main.php里面添加
authManager
component
'authManager'=>array(
'class'=>'CPhpAuthManager',
'defaultRoles'=>array('guest'),
),
根据以上配置,controller
中的onlyadmin
这个action
不允许role
为user的用户去访问
- 创建role并把用户分配到该角色下
//创建role
$auth=Yii::app()->authManager;
$role=$auth->createRole('admin','role admin');
$role=$auth->createRole('user','role user');
$role=$auth->createRole('guest','role guest');
$auth->save();
//把用户分配到某个role下面
$auth=Yii::app()->authManager;
$auth->assign('user',Yii::app()->user->id);
$auth->save();
- RBAC之外的权限控制
可能有些人觉得这样控制还是比较麻烦,Yii还提供了基于expression
的验证方式
- 扩展CWebUser(可以通过重写user类或者修改
UserIdentity
的authenticate
方法)
- 扩展CWebUser(可以通过重写user类或者修改
//修改UserIdentity
public function authenticate()
{
$user=User::model()->find('LOWER(username)=?',array(strtolower($this->username)));
if($user===null)
$this->errorCode=self::ERROR_USERNAME_INVALID;
else if(!$user->validatePassword($this->password))
$this->errorCode=self::ERROR_PASSWORD_INVALID;
else
{
$this->_id=$user->id;
$this->username=$user->username;
$this->setState('role', $user->role);//setState可以直接传递给CWebUser
$this->errorCode=self::ERROR_NONE;
}
return $this->errorCode==self::ERROR_NONE;
}
//修改controoler中的accessRules方法
public function accessRules()
{
return array(
array('deny', // allow authenticated users to access all actions
'actions'=>array('onlyadmin'),
//'roles'=>array('user')
'expression' => '$user->role == "user"'//$user = Yii::app()->user
),
);
}
这样就可以和项目中已有的role
结合起来了
- 本例中使用的是
CPhpAuthManager
,默认会在data
目录下生成一个auth.php
。 - 如果想要使用数据库把
CPhpAuthManager
换乘CDbAuthManager
,然后按照文档配置下即可