Yii2.0中基于AccessControl的权限相关验证统一管理
编写一个统一的BaseController将所有的验证操作放在此控制器的beforeAction和behaviors中进行,然后将将所有需要用到验证的控制器继承这个控制器;并在需要验证和用户分组权限相关的配置放到特定的参数中即可!如下是本人写的一段简单的demo:
BaseController
```class BaseController extends Controller{
/**
* 验证模块
* @var array
*/
public $notlogin_validates = [];//不需登录匹配的
public $all_id_validates = [];//所有匹配的用户
public $post_validates = [];//需要post请求的
public $all = [];//所有匹配的用户
public $not_login = [];//不需登录的
public $post = [];//需要post请求的
/**
* 用户分组权限
* @var array
*/
public $group = [];
public $check = false;
public function beforeAction($action){
if(!empty($action->controller->notlogin_validates)){
$this->not_login = [
'actions' => $action->controller->notlogin_validates,
'allow' => true,
];
}
if(!empty($action->controller->all_id_validates)){
$this->all = [
'actions' => $action->controller->all_id_validates,
'allow' => true,
'roles' => ['@'],
];
}
if(!empty($action->controller->post_validates)){
$this->post = [
'actions'=>$action->controller->post_validates,
'allow' => true,
'verbs' => ['post'],
];
}
$user = Yii::$app->user;
$group = explode(",",$user->identity->group);
if(count($group) > 1){
foreach ($group as $k=>$v){
$this->check = $this->check || in_array($v,$this->group);
}
}elseif (count($group) == 1 && $group[0] == 0){
$this->check = true;
}else{
$this->check = false;
}
return parent::beforeAction($action); // TODO: Change the autogenerated stub
}
public function behaviors(){
if(!$this->check){
throw new Exception('无权访问!');
}
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [$this->not_login,$this->all, $this->post],
],
];
}
然后就是在自己的控制器内继承这个控制器如下:
<div class="se-preview-section-delimiter"></div>
TestController
“`
class TestController extends BaseController{
public
enableCsrfValidation=false;public
all_id_validates = [‘index’];
public
notmatchvalidates=[‘@′];public
group = [‘0’,’4’];
public function actionIndex(){
}
}
写的较为粗糙请多指教!
TestController
class TestController extends BaseController{
public $enableCsrfValidation = false;
public $all_id_validates = ['index'];
public $notmatch_validates = ['@'];
public $group = ['0','4'];
public function actionIndex(){
}
}
写的较为粗糙请多指教!