ci实现RBAC,详细解释原理和核心代码显示
代码实现不复杂,主要是思路的理解 RBAC是基于权限控制
1.权限结点管理
结点管理就是把所有的分组 控制器 方法全部写入一个结点管理表
请注意在写一个动作比如,展示新闻列表,增加,删除,编辑,更新都写成单独的方法,融合是可以减少很多代码量,但是如果是大项目一个权限需要细分的话,就会有很多逻辑判断,不如就每一个都写一个方法,就像用yii的脚手架一样的每个表都写出操作方法
三张表
表结构
admin
| 字段 | 类型 | 空 | 默认 | 注释 |
|---|---|---|---|---|
| id | int(10) | 否 | ||
| admin_name | varchar(20) | 否 | ||
| admin_pwd | varchar(32) | 否 | ||
| 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,详细解释原理和核心代码显示的更多相关文章
- rem布局完成响应式开发,通俗且详细的原理解析和代码实现
一.rem布局基本原理 原理:rem可以理解为一个长度单位,单位rem的值等于网页font-size的值.如果网页的字体大小为默认值16px,那么1rem就等于16px,0.5rem等于8px. 根据 ...
- 转: when.js原理和核心实现
这篇文章可以看作是屈屈同学关于when.js的文章<异步编程:When.js快速上手>的续篇. 屈屈的文章中详细介绍了when.js,在这里关于when.js的使用我就不多复述了,大家可以 ...
- Java进阶(十五)Java中设置session的详细解释
Java中设置session的详细解释 简单通俗的讲session就是象一个临时的容器,用来存放临时的东西.从你登陆开始就保存在session里,当然你可以自己设置它的有效时间和页面,举个简单的例子: ...
- Paxos协议超级详细解释+简单实例
转载自: https://blog.csdn.net/cnh294141800/article/details/53768464 Paxos协议超级详细解释+简单实例 Basic-Paxos算法 ...
- Spring中IOC和AOP的详细解释(转)
原文链接:Spring中IOC和AOP的详细解释 我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂 ...
- Linux下函数调用堆栈帧的详细解释【转】
转自:http://blog.chinaunix.net/uid-30339363-id-5116170.html 原文地址:Linux下函数调用堆栈帧的详细解释 作者:cssjtuer http:/ ...
- 李宏毅机器学习笔记2:Gradient Descent(附带详细的原理推导过程)
李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...
- Spring学习13-中IOC(工厂模式)和AOP(代理模式)的详细解释
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC是工厂模式参考:设计模式- ...
- poj 2104 K-th Number 主席树+超级详细解释
poj 2104 K-th Number 主席树+超级详细解释 传送门:K-th Number 题目大意:给出一段数列,让你求[L,R]区间内第几大的数字! 在这里先介绍一下主席树! 如果想了解什么是 ...
随机推荐
- hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)
Nim or not Nim? Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Sub ...
- HttpHandler动态生成图片
1.向服务器请求返回图片,浏览器是不知道服务上有这个图片的存在的,只是发出请求,接收请求,显示图片 string path = context.Server.MapPath("~/1.jpg ...
- CC2540开发板学习笔记(六)——AD控制(自带温度计)
一.实验目的 将采集的内部温度传感器信息通过串口发送到上位机 二.实验过程 1.寄存器配置 ADCCON1(0XB4)ADC控制寄存器1 BIT7:EOC ADC结束标志位0:AD转换进行中 ...
- Python实现的粒子群优化算法
01.from numpy import array 02.from random import random 03.from math import sin, sqrt 04. 05.iter_ma ...
- 安装phpmyadmin
1.查看PHP版本 新建文本文档,填写下面内容: <?phpphpinfo();?>保存,然后更改文件名为phpinfo.php放到你域名根目录,然后通过你的域名+phpinfo.php浏 ...
- SU unif2命令学习
- HTML-a
链接的其他使用 电话 <a href="tel:(phonenumber)">Tel</a> 短信 <a href="sms:(phonen ...
- Google地图接口API之地图类型(六)
1. Google 地图- 基本地图类型 Google Maps API 中提供了以下地图类型: MapTypeId.ROADMAP,用于显示默认的道路地图视图 MapTypeId.SATELLITE ...
- 水题 ZOJ 3869 Ace of Aces
题目传送门 水题,找出出现次数最多的数字,若多个输出Nobody //#include <bits/stdc++.h> //using namespace std; #include &l ...
- TODO:Half Half的设计
IMessageHandler :消息同步处理接口 AbsQueue:消息队列处理层,可以使用Template Method进行设计 INetWorkLayer:专门处理网络IO的,并附带多线程与异步 ...