thinkphp3.2中的RBAC

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

##对数据表的理解:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值