zoukankan      html  css  js  c++  java
  • 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权限分配

  • 相关阅读:
    服务器又100%了,上一个挖矿病毒解决完,这几天又来了一个新的挖矿病毒。。。。
    一些面试题
    家庭应急储备物资分类
    所学习的docker
    Mysql主从复制原理及同步延迟问题
    关于git
    小程序的get和post需要注意的地方
    CSS3 3D转换
    transform CSS3 2D知识点汇总
    HTML5基础知识总结(一)
  • 原文地址:https://www.cnblogs.com/zoupufa/p/4097646.html
Copyright © 2011-2022 走看看