ci实现RBAC,详细解释原理和核心代码显示

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

RBAC是基于权限控制


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

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

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

 三张表

表结构

admin

字段类型默认注释
idint(10)  
admin_namevarchar(20)  
admin_pwdvarchar(32)  
emailvarchar(40)  
admin_keyvarchar(100)  
role_idint(6)  角色ID,关联admin_role里面的id
timevarchar(20)  

索引

键名类型唯一紧凑字段基数排序规则注释
PRIMARYBTREEid1A 

admin_auth

字段类型默认注释
idint(12)  
auth_namevarchar(40)  角色名称
auth_pidint(12)  没啥意义。预留字段
auth_cvarchar(32)  控制器名称
auth_avarchar(32)  控制器方法
auth_groupvarchar(200)  控制器分组,预留字段,未使用分组
auth_pathvarchar(32)  预留字段,授权路径
auth_levelint(12)  预留字段,授权级别

索引

键名类型唯一紧凑字段基数排序规则注释
PRIMARYBTREEid57A 

admin_role

字段类型默认注释
idint(6)  
role_namevarchar(40)  角色名称
role_auth_idsvarchar(2000) 

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

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

索引

键名类型唯一紧凑字段基数排序规则注释
PRIMARYBTREEid2A 

在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里面实现就是因为下面的每个方法都会去走一遍写的方法
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值