zoukankan      html  css  js  c++  java
  • ci实现RBAC,详细解释原理和核心代码显示

    代码实现不复杂,主要是思路的理解

    RBAC是基于权限控制


    1.权限结点管理
    2.角色管理
    3.管理员权限分配

    结点管理就是把所有的分组 控制器 方法全部写入一个结点管理表

    请注意在写一个动作比如,展示新闻列表,增加,删除,编辑,更新都写成单独的方法,融合是可以减少很多代码量,但是如果是大项目一个权限需要细分的话,就会有很多逻辑判断,不如就每一个都写一个方法,就像用yii的脚手架一样的每个表都写出操作方法

     三张表

    表结构

    admin

    字段类型默认注释
    id int(10)    
    admin_name varchar(20)    
    admin_pwd varchar(32)    
    email varchar(40)    
    admin_key varchar(100)    
    role_id int(6)    角色ID,关联admin_role里面的id
    time varchar(20)    

    索引

    键名类型唯一紧凑字段基数排序规则注释
    PRIMARY BTREE id 1 A  

    admin_auth

    字段类型默认注释
    id int(12)    
    auth_name varchar(40)    角色名称
    auth_pid int(12)    没啥意义。预留字段
    auth_c varchar(32)    控制器名称
    auth_a varchar(32)    控制器方法
    auth_group varchar(200)    控制器分组,预留字段,未使用分组
    auth_path varchar(32)    预留字段,授权路径
    auth_level int(12)    预留字段,授权级别

    索引

    键名类型唯一紧凑字段基数排序规则注释
    PRIMARY BTREE id 57 A  

    admin_role

    字段类型默认注释
    id int(6)    
    role_name varchar(40)    角色名称
    role_auth_ids varchar(2000)  

     角色所包含id集合,例1,2,3,4等

    role_auth_acs text    角色包含控制器方法集合,例admin-index,admin-main_update等等

    索引

    键名类型唯一紧凑字段基数排序规则注释
    PRIMARY BTREE id 2 A  

    在admin控制器中

    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    
    class Admin extends CI_Controller { 
    function __construct() {
    parent::__construct();
    $this->load->helper('form');
    $this->load->library('pagination');
    //admin用户权限验证,把session的用户名密码放到admin表查询如果有OK 
    $name=$this->session->userdata('admin_name');
    $pwd=$this->session->userdata('admin_pwd');
    $this->load->model('admin_model');
    $this->load->model('home_model');
    $r = $this->home_model->admin_check($name,$pwd);
    if ($r){
    $id = $this->session->userdata('role_id');//登陆的时候吧角色id存到session里面
    $ci= &get_instance();//获取超级对象
    $directory = substr($ci->router->fetch_directory(),0,-1);//获取控制器分组
    $controller = $ci->router->fetch_class();//获取控制器名称
    $function = $ci->router->fetch_method();//获取控制器方法
    // echo $directory."/".$controller."/".$function;
    $f=$controller."-".$function;//拼接当前控制器方法
    $s= $this->admin_model->right_check($table= 'admin_role',$id);//当前角色id对应控制方法集合就是admin_role的role_auth_acs
    if(in_array($f, explode(',', $s['role_auth_acs']))){ //$f是不是在$s['role_auth_acs']的集合里面,如果没有就显示没有前线停止当前程序
    // echo 'ok';
    } else {
    echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>';
    echo '没有权限';
    exit();
    }
    } else {
    redirect('home/adminlogin');
    } 
    
    }
    
    在整个控制器admin的__construct里面实现就是因为下面的每个方法都会去走一遍写的方法
  • 相关阅读:
    delphi 数据导出 进度条自己生成
    在存储过程中编写正确的事务处理代码(SQL Server 2000 & 2005)
    在Delphi中如何获得SQL中存储过程的返回值?
    object-c中管理文件和目录:NSFileManager使用方法
    Delphi中动态链接库(DLL)的建立和使用
    开源免费天气预报接口API以及全国所有地区代码!!(国家气象局提供)
    wince 程序无法执行的原因
    如果我写一个播放器
    busybox配置
    switch case被人忽视的一点!zt
  • 原文地址:https://www.cnblogs.com/zx-admin/p/4305549.html
Copyright © 2011-2022 走看看