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') );
                    }
                }
            }
        }
    ?>
  • 相关阅读:
    CSS文本过长时设置省略号
    css设置边框四角样式
    最通俗易懂的flex讲解
    原型与原型链详解
    Vue+Element中Table懒加载,新增、删除操作后手动更新
    docker +node 部署vue项目的心路历程
    centOS 7 添加删除用户和用户组
    图表工具FusionCharts Amcharts Highcharts jscharts
    做好PM的几个关键事项
    Bash . configure permission denied错误
  • 原文地址:https://www.cnblogs.com/dudeyouth/p/6237722.html
Copyright © 2011-2022 走看看