博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
thinkphp3.2中的RBAC
阅读量:7072 次
发布时间:2019-06-28

本文共 3265 字,大约阅读时间需要 10 分钟。

  hot3.png

非教程,单纯的笔记,对读者没有参考价值

##对数据表的理解:

node表的pid和level字段

pid: 模块,控制器,方法(关联)

level 模块为1,控制器为2 ,方法为3

access表的level字段和module字段

level 同node中的level字段 module字段,控制器的名称,可以不要

###递归组合节点:

/** * [node_merge description] * @param  [type]  $node [description] * @param  integer $pid  [description] * @return [type]        [description] */function node_merge($node,$pid=0){        $arr=array();//不可以方法哦foreach    foreach ($node as $value) {        if($value['pid']==$pid){//用==                            //永远处理的都是这个数组            $value['child']=node_merge($node,$value['id']);            $arr[]=$value;        # code...        }    }    return $arr;}/** * [node_merge description] * @param  [type]  $node [description] * @param  integer $pid  [description] * @return [type]        [description] */function node_merge2($node,$access,$pid=0){        $arr=array();//不可以方法哦foreach    foreach ($node as $value) {         $value['access']=in_array($value['id'],$access)? 1:0;        if($value['pid']==$pid){//用==                   //永远处理的都是这个数组            $value['child']=node_merge2($node,$access,$value['id']);            $arr[]=$value;        # code...        }    }    return $arr;}/** * [node_merge description] * @param  [type]  $node [description] * @param  integer $pid  [description] * @return [type]        [description] */function node_merge3($node,$access=null,$pid=0){        $arr=array();//不可以方法哦foreach    foreach ($node as $value) {        if(is_array($access)){             $value['access']=in_array($value['id'],$access)? 1:0;          }        if($value['pid']==$pid){//用==                   //永远处理的都是这个数组            $value['child']=node_merge3($node,$access,$value['id']);            $arr[]=$value;        # code...        }    }    return $arr;}

##RBAC类

###1. 配置

//'配置项'=>'配置值'"USER_AUTH_ON"=>true, // 是否需要认证(true为验证,false为不需要)"USER_AUTH_TYPE"=>2, // 认证类型 (1为登陆验证,2位时时验证)"USER_AUTH_KEY"=>"uid", // 认证识别号 (保存的session名称,识别号,一般为用户ID)"REQUIRE_AUTH_MODULE"=>"", //  需要认证模块 "NOT_AUTH_MODULE"=>"", // 无需认证模块"USER_AUTH_GATEWAY"=>"" ,// 认证网关// "NOT_AUTH_ACTION"=>"Login,Index","NOT_AUTH_MODULE"=>"Index",//"RBAC_DB_DSN"=>"" //  数据库连接DSN"RBAC_ROLE_TABLE"=>"think_role", // 角色表名称 (必须加上前缀)"RBAC_USER_TABLE"=>"think_role_user", // 用户表名称"RBAC_ACCESS_TABLE"=>"think_access", // 权限表名称"RBAC_NODE_TABLE"=>"think_node", // 节点表名称"ADMIN_AUTH_KEY"=>"admin", (超级管理员识别号)

##2.怎么识别超级管理员(他有所有权限)

"ADMIN_AUTH_KEY"=>"admin", (超级管理员识别号)

控制器逻辑

if($user['id']==1){            session(C('ADMIN_AUTH_KEY'),true);          }else{            session(C('ADMIN_AUTH_KEY'),false);          }

RBAC类:

saveAccessList方法

if(C('USER_AUTH_TYPE') !=2 && !$_SESSION[C('ADMIN_AUTH_KEY')] )

AccessDecision方法

if(empty($_SESSION[C('ADMIN_AUTH_KEY')])) {

##3.怎么保存权限

步骤1:登陆之后session写入uid识别号,包括判断管理员

session('uid',$user['id']);      if($user['id']==1){        session(C('ADMIN_AUTH_KEY'),true);      }else{        session(C('ADMIN_AUTH_KEY'),false);      }Rbac::saveAccessList();

步骤2:调用saveAccessLis() 方法保存权限

Rbac::saveAccessList();返回空,他的作用是吧权限写入seesion

$_SESSION['_ACCESS_LIST']	=	self::getAccessList($authId);//

##4.怎么验证权限

public  function _initialize(){			 Rbac::AccessDecision(MODULE_NAME)||$this->error('没有权限');					}
AccessDecision(MODULE_NAME)传入模块名称:  有权限返回true五权限返回false```

转载于:https://my.oschina.net/oneboi/blog/892859

你可能感兴趣的文章
UVa11183 - Teen Girl Squad(最小树形图-裸)
查看>>
高速排序--双边扫描与单边扫描的实现
查看>>
win7 64位专业版下的x64编译问题
查看>>
nginx的access_log与error_log(三)
查看>>
10个财务工作中常用的 Excel 万能公式
查看>>
苹果iOS手机后门的”诊断功能论“不攻自破
查看>>
记一次使用utl_http方法调用接口,报字符或值错误
查看>>
APDU命令与响应格式【转】
查看>>
CodeForces484A Bits(贪心)
查看>>
前端生成图表
查看>>
数据结构:二叉树(前,中,后,层次)非递归遍历。
查看>>
nodejs-ORM 操作数据库中间件waterline的使用
查看>>
不允许使用抽象类类型
查看>>
Android利用方向传感器获得手机的相对角度实例说明
查看>>
从头认识java-13.9 隐式和显示的创建类型实例
查看>>
git笔记之安装使用
查看>>
jquery中的动画
查看>>
用python将MSCOCO和Caltech行人检测数据集转化成VOC格式
查看>>
Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求
查看>>
centos/linux下的安装Tomcat
查看>>