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') );
                    }
                }
            }
        }
    ?>
  • 相关阅读:
    OpenStack对象存储管理手册(5) OpenStack对象存储系统管理3
    hdu1568Fibonacci
    智能手机中显示信号强度格数
    上篇日本人经营之道 一破坏对手的情绪乱其方寸
    基于Wince的计算器程序
    shell 字符串操作
    轻松记住大端小端的含义
    如何把手机变成你的救生设备
    PM是一个事实
    mysql 5.6 online ddl 测试
  • 原文地址:https://www.cnblogs.com/dudeyouth/p/6237722.html
Copyright © 2011-2022 走看看