Yii2.0中基于AccessControl的权限相关验证统一管理

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(){

    }
}

写的较为粗糙请多指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值