zoukankan      html  css  js  c++  java
  • 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',
                                                                           
                      ),        
                   );
    }
    
    ?>
  • 相关阅读:
    定位服务器的性能
    关于tcp的keepalive
    写给future的话
    声音评测专用术语
    高效能人士必知铁律--note
    《如何高效学习》读书笔记
    如何快速接手一个系统?
    几个基础函数及特性
    最大的矩形(测试全对,为什么只有20分??)
    输入字符串(由0,1组成),编程计算其中连续0,1出现的最大次数
  • 原文地址:https://www.cnblogs.com/wuheng1991/p/5197089.html
Copyright © 2011-2022 走看看