zoukankan      html  css  js  c++  java
  • RBAC角色权限控制

    RBAC角色权限控制

      1. user (用户表)

        *  用户的基本信息(mid:用户信息id  如图)

        

      2. node (节点表)

        * 页面(模块控制器方法)

        

      3. role_node(角色、节点关联表)

        * 节点与角色(页面与角色)的对应关系(多对多)

        

      4. role (角色表)

         * 角色组

           

      5. user_role (用户角色关联表)

         * 用户与角色的对应关系(一对一)

        

        * 如果允许一个用户设置多个角色,那么角色权限鉴定一般使用两种方法:

         1. 角色组的权限取并集 (即:只要其中一个组拥有权限,用户就能使用该权限)

         2. 角色组的权限取交集(即:多个组同时拥有的权限,用户才能使用)

      

        权限检测模型:

      1. 使用role_node表,通过用户的rid(角色id,允许一个用户拥有多个角色)与nid(页面:模块控制器、方法)查询用户是否拥有权限

    <?php
    namespace Commonmodel;
        class Rbac{
            // 检验是否登录
            public function is_login(){
                if( !session('uid') ){
                    return false;
                }else{
                    return true;
                }
            }
            // 检验权限
            public function check_access($rids=[],$actions){
                $access_table=C('ACCESS_TABLE');
                $node_table=C('NODE_TABLE');
                if(self::filter_module()){
                    return true;
                }else{
                    return false;
                }
                $status = M($table_name)->alias('a')
                                        ->join('__'.$node_table.'__'.' n on n.id=a.nid')
                                        ->where(['a.rid'=>['in',$rids],'n.url'=>$actions])
                                        ->find();
                if(status){
                    return true;
                }else{
                    return false;
                }
            }
            //检测模块是否需要检验权限
            public function filter_module(){
                if(MODULE_NAME===C('NOT_CHECK_MODULE')){
                    return true;
                }else{
                    return false;
                }
            }
    
        }
    ?>

    行为监听:

      

    <?php 
    namespace CommonBehavior;
        use  ThinkBehavior;
        class ControllerBehavior extends Behavior{
            // 行为执行入口
            public function run(&$param){
                if( !in_array(CONTROLLER_NAME,array('Index','Public','Weixin','Test')) ){
                    if( D('Rbac')->is_login() ){
                        // 检查登陆
                        $action = MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME;
                        if( D('Rbac')->check_access(session('role_id'), $action )===false ){
                                redirect( U('Index/no_permissions') );
                        }
                    }else{
                        // 没有登录
                        redirect( U('Index/index') );
                    }
                }
            }
        }
    ?>
  • 相关阅读:
    解释机器学习模型的一些方法(一)——数据可视化
    机器学习模型解释工具-Lime
    Hive SQL 语法学习与实践
    LeetCode 198. 打家劫舍(House Robber)LeetCode 213. 打家劫舍 II(House Robber II)
    LeetCode 148. 排序链表(Sort List)
    LeetCode 18. 四数之和(4Sum)
    LeetCode 12. 整数转罗马数字(Integer to Roman)
    LeetCode 31. 下一个排列(Next Permutation)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    论FPGA建模,与面向对象编程的相似性
  • 原文地址:https://www.cnblogs.com/dudeyouth/p/6237722.html
Copyright © 2011-2022 走看看