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

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里面实现就是因为下面的每个方法都会去走一遍写的方法

ci实现RBAC,详细解释原理和核心代码显示的更多相关文章

  1. rem布局完成响应式开发,通俗且详细的原理解析和代码实现

    一.rem布局基本原理 原理:rem可以理解为一个长度单位,单位rem的值等于网页font-size的值.如果网页的字体大小为默认值16px,那么1rem就等于16px,0.5rem等于8px. 根据 ...

  2. 转: when.js原理和核心实现

    这篇文章可以看作是屈屈同学关于when.js的文章<异步编程:When.js快速上手>的续篇. 屈屈的文章中详细介绍了when.js,在这里关于when.js的使用我就不多复述了,大家可以 ...

  3. Java进阶(十五)Java中设置session的详细解释

    Java中设置session的详细解释 简单通俗的讲session就是象一个临时的容器,用来存放临时的东西.从你登陆开始就保存在session里,当然你可以自己设置它的有效时间和页面,举个简单的例子: ...

  4. Paxos协议超级详细解释+简单实例

    转载自:  https://blog.csdn.net/cnh294141800/article/details/53768464 Paxos协议超级详细解释+简单实例   Basic-Paxos算法 ...

  5. Spring中IOC和AOP的详细解释(转)

    原文链接:Spring中IOC和AOP的详细解释 我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂 ...

  6. Linux下函数调用堆栈帧的详细解释【转】

    转自:http://blog.chinaunix.net/uid-30339363-id-5116170.html 原文地址:Linux下函数调用堆栈帧的详细解释 作者:cssjtuer http:/ ...

  7. 李宏毅机器学习笔记2:Gradient Descent(附带详细的原理推导过程)

    李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...

  8. Spring学习13-中IOC(工厂模式)和AOP(代理模式)的详细解释

    我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC是工厂模式参考:设计模式- ...

  9. poj 2104 K-th Number 主席树+超级详细解释

    poj 2104 K-th Number 主席树+超级详细解释 传送门:K-th Number 题目大意:给出一段数列,让你求[L,R]区间内第几大的数字! 在这里先介绍一下主席树! 如果想了解什么是 ...

随机推荐

  1. linux下文件压缩与解压操作

    对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕.别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rap.可 ...

  2. HTTP状态码和常用对照表

    http://tool.oschina.net/commons 响应码:“200” : OK: “302” : Found 暂时转移,用于重定向, Response.Redirect()会让浏览器再请 ...

  3. 学习BigDecimal用法

    一.简介 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更 ...

  4. .net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串

    1.继承(1)创建子类对象的时候,在子类对象中会为子类对象的字段开辟空间,也会为父类的所有字段开辟空间,只不过父类私有的成员访问不到(2)子类从父类继承父类所有的非私有成员,但是父类的所有字段也会创建 ...

  5. WPF常用方法,事件驱动和控件遍历

    //初始化数据,默认选中第一项,事件驱动 RadioButton btn = FuncClass.GetChildObject<RadioButton>(this.stackPanel1, ...

  6. chromium的Backtrace记录

    ffmpeg处理完视频流后,上层的webrtc调用错误,可以看出webrtc的调用过程: Backtrace: webrtc::RTPFragmentationHeader::CopyFrom [0x ...

  7. HDU 4349 Xiao Ming's Hope lucas定理

    Xiao Ming's Hope Time Limit:1000MS     Memory Limit:32768KB  Description Xiao Ming likes counting nu ...

  8. 补间动画TweenAnimation

    animation_translate = AnimationUtils.loadAnimation(MainActivity.this, R.anim.transalte); imageview.s ...

  9. ClassPathXmlApplicationContext的启动

    Spring将ApplicationContext启动的全过程,refresh函数中包含了几乎ApplicationContext中提供的全部功能,而且此函数中逻辑非常清晰明了,很容易分析对应的层次及 ...

  10. Rightmost Digit

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...