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') );
                }
            }
        }
    }
?>
原文地址:https://www.cnblogs.com/dudeyouth/p/6237722.html