代码实现不复杂,主要是思路的理解1.权限结点管理
RBAC是基于权限控制
2.角色管理
3.管理员权限分配
结点管理就是把所有的分组 控制器 方法全部写入一个结点管理表
请注意在写一个动作比如,展示新闻列表,增加,删除,编辑,更新都写成单独的方法,融合是可以减少很多代码量,但是如果是大项目一个权限需要细分的话,就会有很多逻辑判断,不如就每一个都写一个方法,就像用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里面实现就是因为下面的每个方法都会去走一遍写的方法