非教程,单纯的笔记,对读者没有参考价值
##对数据表的理解:
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```