ThinkPHP项目笔记之RBAC(权限)补充篇

这里,主要补充的是配置以及相关代码问题。

<?php
return array(
    //'配置项'=>'配置值'
'RBAC_SUPERADMIN' => 'admin',//超级管理员名称,对应用户表中某一个用户:username
'ADMIN_AUTH_KEY' => 'superadmin',//超级管理员识别    

'USER_AUTH_ON' => true, //是否需要认证
'USER_AUTH_TYPE' => 1, //认证类型 1-登陆后认证,2-实时认证
'USER_AUTH_KEY' => 'authId', //认证识别号,此处可以自定义
//'REQUIRE_AUTH_MODULE' => '',  //需要认证模块
'NOT_AUTH_MODULE' => 'User,Index,Safe', //无需认证模块,和上面重复
'NOT_AUTH_ACTION' => 'addRoleHandle,addNodeHandle,addUserHandle,accessHandle',//无需认证操作
//'USER_AUTH_GATEWAY' => '', //认证网关,此处可以不用
//'RBAC_DB_DSN' => '',  //数据库连接DSN
'RBAC_ROLE_TABLE' => 'tp_role', //角色表名称
'RBAC_USER_TABLE' => 'tp_role_user', //用户表名称
'RBAC_ACCESS_TABLE' => 'tp_access', //权限表名称
'RBAC_NODE_TABLE' => 'tp_node', //节点表名称

这个一栏作为菜单,必定有其相应的代码:

 //左边菜单
    public function left(){
// var_dump(session('role-id'));

         $this -> assign("ouba",session('role-id'));
        //超级管理员
        if(session(C('ADMIN_AUTH_KEY'))){
            $node = D('Tp_node') ->relation(true)-> where('level = 2') -> order('sort')-> select();
        }else{
            //取出所有权限节点
            $node = D('Tp_node') ->relation(true)-> where('level = 2') -> order('sort')-> select();
            //取出当前登录用户所有权限(英文名称)和操作权限
            $module = '';
            $node_id = '';
            $accessList =  $_SESSION['_ACCESS_LIST'];
            foreach($accessList as $key => $value){
                foreach($value as $key1 => $value1){
                    $module = $module.','.$key1; 
                    foreach($value1 as $key2 => $value2){
                        // $node_id = $node_id.','.$key2;
                        $node_id = $node_id.','.$value2;

                    }
                }
            }
            
            //去掉没有权限的节点
            foreach($node as $key => $value){
                 if(!in_array(strtoupper($value['name']),explode(',',$module))){
                   unset($node[$key]);
                 }
                 else{
                    //模块存在,比较里面的操作
                    foreach($value['node'] as $key1 => $value1){
                        // if(!in_array(strtoupper($value1['name']),explode(',',$node_id))){
                        if(!in_array(strtoupper($value1['id']),explode(',',$node_id))){        
                            unset($node[$key]['node'][$key1]); //一层一层下来,删除此操作
                        }
                    }
                 }
            }
        }
        $this -> assign('node',$node);
        $this->display();
    }

注意几点:该函数方法主要对于权限的节点的处理,其中使用的“大D”,则在Model,中必有其对应的映射关系:

<?php
namespace ManageModel;
use ThinkModelRelationModel;
class TpNodeModel extends RelationModel{
    protected $_link = array(
               'Tp_node'=>array(
                  'mapping_type'=> self::HAS_MANY, 
                  'parent_key'=>'pid',
                   // 'class_name'=> 'Article',
                    'foreign_key'=> 'id',
                   'mapping_name'  => 'node',
                   //  'mapping_order' => 'create_time desc',
                                                                       
                  ),        
               );
}

?>
原文地址:https://www.cnblogs.com/wuheng1991/p/5197089.html