thinkphp rabc权限总结

今天晚上把ThinkPHP的权限分配弄明白了,心里的包袱立刻放下了,感觉那个爽啊!稍微记录一下。

背景:CMS系统开发(17do)。

项目分组:Admin(后台管理)、Home(前台显示)。
Admin组中包含ManagerAction、UserActin、ArticleAction三个控制器

第一部分:表关系对应(箭头是指数据来源)

 ThinkPHP扩展RBAC权限分配

ThinkPHP扩展RBAC权限分配
其中表结构式根据RBAC规定的结构创建的。

定义结果:站长1能访问项目用户和文章的所有操作,管理员3只能对文章模块操作不能访问用户模块。

第二部分:项目配置
项目的config.php文件中添加

    //权限分配设置
     'USER_AUTH_ON'=>true, //是否需要认证
    'USER_AUTH_TYPE'=>1, //认证类型
    'USER_AUTH_KEY'=>'userId',  // 认证识别号
    'USER_AUTH_MODEL'=>'user',//模型实例(用户表名)
    'REQUIRE_AUTH_MODULE'=>'User',  //需要认证模块
    'NOT_AUTH_MODULE'=>'',   //无需认证模块
    'USER_AUTH_GATEWAY'=>'/Public/login', //认证网关
    //RBAC_DB_DSN  数据库连接DSN
    'RBAC_ROLE_TABLE'=>'do_role', //角色表名称
    'RBAC_USER_TABLE'=>'do_role_user', //用户和角色对应关系表名称
    'RBAC_ACCESS_TABLE'=>'do_access', //权限分配表名称
    'RBAC_NODE_TABLE'=>'do_node',  // 权限表名称

第三部分:权限信息写入控制器

    public function checkUser(){
        //表单数据不能为空
        if($this->_post('username')&&$this->_post('password')&&$this->_post('verifycode')){
            $pwd=  $this->_post('password');
            $username=  $this->_post('username');
            //验证码是否正确
            $verify=  $this->_post('verifycode');
            if($this->_session('verify')!=  md5($verify)){
                $this->error("验证码错误");
            }else{
                //创建数据库对象
                $user=M('user');
                //根据用户名查询               
                $cond['username']=$username;
                $cond['active']=array('gt',0);
                //加载RBAC类
                import('ORG.Util.RBAC');
                //通过authenticate读取用户信息
                $result=RBAC::authenticate($cond);
                //dump($result);
                if($result){
                    if($result['password']==md5($pwd)){
                        $_SESSION[C('USER_AUTH_KEY')]=$result['id'];
                        $_SESSION["name"]=$result['name'];
                        //使用saveAccessList缓存访问权限
                        RBAC::saveAccessList();
                        $this->display('Manager:index');
                    }else{
                        $this->error("用户密码错误");
                    }
                }else{
                    $this->error("用户名不存在或已经被禁用");
                }

 }

第四部分:创建验证权限控制器

 class CommonAction extends Action{

    //_initialize()方法是ThinkPHP提供的入口方法,类似于原PHP中__condition()构造函数。可以存放所有公用信息。
    function _initialize(){
        //判断是否开启认证,并且当前模块需要验证
        if(C('USER_AUTH_ON')&&!in_array(MODULE_NAME, explode(',', C('NOT_AUTH_MODULE')))){
            //导入RBAC类,开始验证
            import('ORG.Util.RBAC');
            //通过accessDecision获取权限信息
            if(!RBAC::AccessDecision()){
                //没有获取到权限信息时需要执行的代码
                //1、用户没有登录
                if(!$_SESSION[C('USER_AUTH_KEY')]){
                    $url= U('Public/login');
                    $this->error("您还没有登录不能访问",$url);
                }
                $this->error("您没有操作权限");
            }
        }
    }
}

第五部分:验证控制器调用

只要需要权限验证的控制器继承CommonAction就可以啦!ThinkPHP扩展RBAC权限分配

使用admin账号登陆能正常访问

ThinkPHP扩展RBAC权限分配
使用xiaoxiao账号登陆后不能访问用户列表页面
ThinkPHP扩展RBAC权限分配

原文地址:https://www.cnblogs.com/zoupufa/p/4097646.html