首页 > 代码库 > thinkphp rabc权限总结

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‘,  // 权限表名称

 

 

 

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

    publicfunction 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权限分配

thinkphp rabc权限总结