• 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',
                                                                           
                      ),        
                   );
    }
    
    ?>
  • 相关阅读:
    js获取对象的最后一个
    vue UI框架
    从前端和后端两个角度分析jsonp跨域访问(完整实例)
    Ajax跨域访问解决方案
    js中将字符串转换成json的三种方式
    【转载】COM 组件设计与应用(九)——IDispatch 接口 for VC6.0
    【转载】COM 组件设计与应用(八)——实现多接口
    【转载】COM 组件设计与应用(七)——编译、注册、调用
    【转载】COM 组件设计与应用(六)——用 ATL 写第一个组件
    【转载】COM 组件设计与应用(五)——用 ATL 写第一个组件
  • 原文地址:https://www.cnblogs.com/wuheng1991/p/5197089.html
Copyright © 2020-2023  润新知