phpcms中的RBAC权限系统
PHPCMS中的RBAC权限系统主要用到了4张数据表:管理员表,角色表,菜单表,菜单权限表。先来看看数据库的数据表结构:
admin 管理员表
| ID | 字段 | 类型 | Null | 默认 | 索引 | 额外 | 注释 |
|---|---|---|---|---|---|---|---|
| 1 | userid | mediumint(6) | unsigned | PK | auto_increment | 用户id | |
| 2 | username | varchar(20) | YES | INDEX | 用户名 | ||
| 3 | password | varchar(32) | YES | 密码 | |||
| 4 | roleid | smallint(5) | YES | 0 | 角色 | ||
| 5 | encrypt | varchar(6) | YES | 加密因子 | |||
| 6 | lastloginip | varchar(15) | YES | 最后登录ip | |||
| 7 | lastlogintime | int(10) unsigned | YES | 0 | 最后登录时间 | ||
| 8 | varchar(40) | YES | |||||
| 9 | realname | varchar(50) | NO | 真实姓名 | |||
| 10 | card | varchar(255) | NO | 密保卡 |
admin_role 角色表
| ID | 字段 | 类型 | Null | 默认 | 索引 | 额外 | 注释 |
|---|---|---|---|---|---|---|---|
| 1 | roleid | tinyint(3) unsigned | PK | auto_increment | 角色id | ||
| 2 | rolename | varchar(50) | NO | 角色名称 | |||
| 3 | description | text | NO | 描述 | |||
| 4 | listorder | smallint(5) unsigned | NO | 0 | INDEX | 排序 | |
| 5 | disabled | tinyint(1) unsigned | NO | 0 | INDEX | 状态:1,禁用 |
menu 菜单表
| ID | 字段 | 类型 | Null | 默认 | 索引 | 额外 | 注释 |
|---|---|---|---|---|---|---|---|
| 1 | id | smallint(6) unsigned | PK | auto_increment | 菜单id | ||
| 2 | name | char(40) | NO | 名称 | |||
| 3 | parentid | smallint(6) | NO | 0 | INDEX | 父id | |
| 4 | m | char(20) | NO | INDEX | m | ||
| 5 | c | char(20) | NO | INDEX | c | ||
| 6 | a | char(20) | NO | INDEX | a | ||
| 7 | data | char(100) | NO | 附件参数 | |||
| 8 | listorder | smallint(6) unsigned | NO | 0 | INDEX | 排序 | |
| 9 | display | enum('1','0') | NO | 1 | 是否显示,1 显示 |
admin_role_priv 菜单权限表
| ID | 字段 | 类型 | Null | 默认 | 索引 | 额外 | 注释 |
|---|---|---|---|---|---|---|---|
| 1 | roleid | tinyint(3) unsigned | 0 | PK | 角色id | ||
| 2 | m | char(20) | NO | INDEX | m | ||
| 3 | c | char(20) | NO | INDEX | c | ||
| 4 | a | char(20) | NO | INDEX | a | ||
| 5 | data | char(30) | NO | 附件属性 | |||
| 6 | siteid | smallint(5) unsigned | NO | 0 | INDEX | 所属站点 |
下面来简单分析一下4张表的关系:
1.用户表中的每个用户有一个角色字段roleid,表明了该用户属于哪个角色。
2.角色表的主键为roleid,与用户表中的roleid相对应,还有角色名称,描述等,比如PHPCMS系统默认有超级管理员、总编、发布人员等角色。
3.管理员权限表中主键也是roleid,与角色表中的主键roleid相对应,表明了该角色拥有的后台操作权限。字段m、c、a分别代表的是模型 | 控制器 | 方法,因为PHPCMS本身也是MVC结构,所以更好地使权限系统的粒度细化到方法上面。
4.菜单表主要存放菜单属性,其中的m、c、a与管理员权限表中的字段相对应。
最后来看看用户的操作及验证流程:
首先,用户在后台登录,如果登录成功,将roleid(角色id)存入SESSION,然后跳转到后台首页,在PHPCMS系统中,整个后台操作的部分都在admin模块中,所以该模块中所有的控制器均继承自admin类,并且在构造方法中执行了父类的构造方法(admin的构造方法)。那么,admin类的构造方法有执行了哪些操作呢?
首先是调用自身的 check_admin() 来判断用户是否登录,紧接着判断用户的权限: check_priv()
check_priv() 方法源代码:
## 格式略微修改
final public function check_priv()
{
if (ROUTE_M == 'admin' && ROUTE_C == 'index' && in_array(ROUTE_A, array('login', 'init', 'public_card'))) {
return true;
}
if ($_SESSION['roleid'] == 1) {
return true;
}
$siteid = param::get_cookie('siteid');
$action = ROUTE_A;
$privdb = pc_base::load_model('admin_role_priv_model');
if (preg_match('/^public_/', ROUTE_A)) {
return true;
}
if (preg_match('/^ajax_([a-z]+)_/', ROUTE_A, $_match)) {
$action = $_match[1];
}
$r = $privdb->get_one(
array(
'm' => ROUTE_M,
'c' => ROUTE_C,
'a' => $action,
'roleid' => $_SESSION['roleid'],
'siteid' => $siteid
)
);
if (!$r) {
showmessage('您没有权限操作该项', 'blank');
}
}
该方法首先判断当前正在进行的操作,如果是登录或者初始化操作,则退出。
然后判断角色是否为超级管理员(超级管理员默认为最高权限),如果是,依旧退出,或者如果当前方法为公开的(没有权限限制),同样退出。
最后加载 admin_role_priv_model,也就是管理员权限模型,获取当前要操作的模型 | 控制器 | 方法,利用 admin_role_priv_model 提供的方法进行查询,如果可以返回数据,则说明角色可以进行当前操作,反之,弹出提示信息:您没有权限操作该项,然后退出!
对了,忘了介绍后台菜单的生成过程啦!其实用到的还是admin类自身的方法:admin_menu(): 不过该方法是在 index.tpl.php 模板中调用的,主要进行的操作是先取出菜单表中所有菜单,然后判断当前角色,如果为超级管理员,则直接返回菜单数组,反之,则将符合当前角色权限的菜单数组返回。
以上就是PHPCMS系统的权限结构及操作流程!
phpcms中的RBAC权限系统的更多相关文章
- TP支持菜单动态生成RBAC权限系统数据库结构设计方案
最简单基于RBAC权限系统数据库结构设计 包括如下几个表 1. 用户表 -- Table "t_user" DDL CREATE TABLE `t_user` ( `id` int ...
- Thinkphp3.2.3中的RBAC权限验证
最近在用TP的RBAC权限控制,在这里记录学习一下.先来看看相关的概念 一.相关概念 访问控制与RBAC模型1.访问控制: 通常的多用户系统都会涉及到访问控制,所谓访问控制,是指通过某种 ...
- 如何在数据库中进行RBAC权限应用
上周我们发了一篇关于"删库跑路"引发了大家对于数据安全的思考,而权限管理又跟数据安全密不可分.权限管理作为数据系统的重要组成部分,通过控制账号的可支配能力,防止因用户操作不当导致的 ...
- ThinkPHP中:RBAC权限控制的实习步骤
使用版本ThinkPHP3.1.3 第一步,建表及数据 第二步,建关联模型 第三步,控制器使用关联模型.配置文件 第四步,模板显示数据 第一步,建表及数据 在数据库中,建立一个companysvn数据 ...
- 基于SSM的RBAC权限系统(1)-利用ajax,bootstrap,ztree完成权限树功能
仅支持回显以及选择,不支持在树中的编辑 搭建后台回显以及修改的模块 JSON数据封装 public class Msg { private int code; private String msg; ...
- CRM项目之RBAC权限组件-day26
写在前面 上课第26天,打卡: 世间安得双全法 不负如来不负卿 s17day26 CRM项目 项目概要:XX公司CRM - 权限管理,公共组件,app ***** - 熟悉增删改查,Low *** - ...
- 权限系统与RBAC模型概述
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3793894.html ...
- 权限系统与RBAC模型概述[绝对经典]
0. 前言 一年前,我负责的一个项目中需要权限管理.当时凭着自己的逻辑设计出了一套权限管理模型,基本原理与RBAC非常相似,只是过于简陋.当时google了一些权限管理的资料,从中了解到早就有了RBA ...
- ThinkPHP中RBAC权限带菜单栏显示和详细权限操作
RBAC是什么,能解决什么难题? RBAC是Role-Based Access Control的首字母,译成中文即基于角色的权限访问控制,说白了也就是用户通过角色与权限进行关联[其架构灵感来源于操作系 ...
随机推荐
- jQuery浏览器类型判断和分辨率判断
< DOCTYPE html PUBLIC -WCDTD XHTML TransitionalEN httpwwwworgTRxhtmlDTDxhtml-transitionaldtd> ...
- [Leetcode] Course Schedule
There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...
- 极光推送JPush的快速集成
首先到极光推送的官网上创建一个应用,填写对应的应用名和包名. 创建好之后下载Demo 提取Sdk里面的图片和xml等资源文件放自己项目的相应位置,然后要注意的是.so文件的放置位置: 在main目录下 ...
- iOS开发小技巧--iOS程序进入后台运行的实现
iOS程序进入后台运行的实现 视频中看到老师用的iOS7,代码中有开启timer,无限请求数据的功能,但是切换到后台,代码就不打印了 自己用的iOS9,进入后台还是可以打印的,再次进入前台也可以正常运 ...
- windows下使用vs进行Proctocol Buffer开发(C++篇)
因工作原因接触Proctocol Buffer(protobuf),至于什么是protobuf,为何使用protobuf,我就不赘述了,百度下都是答案. 今天我介绍的是在windows下使用vs进行p ...
- Web Analytics 2.0 中文翻译 [ 系列索引 ]
引言 内容概述 第一章:网站分析2.0的新奇世界 第二章:选择你的网络分析灵魂伴侣的最佳策略 第三章:点击流分析的奇妙世界:指标 第四章:点击流分析的奇妙世界:实际的解决方案 第五章:荣耀之钥:度量成 ...
- js 时间戳转换成几分钟前,几小时前,几天前
formatMsgTime (timespan) { var dateTime = new Date(timespan); var year = dateTime.getFullYear(); var ...
- HTML实现点击时的阴影(:active)(已解决iOS微信上无法使用)
一般是用这个委类:active 参考:http://www.w3school.com.cn/cssref/selector_active.asp 但是业界上实现的效果中,今日头条的手机端网页却不是这样 ...
- 狼人杀BETA阶段计划简介
狼人杀beta阶段任务与目标 简介 一.前言 狼人杀alpha阶段终于在组团刷夜中结束了,我们取得了一些成绩,同时也暴露了团队的一些问题.但不管怎样,有了在alpha版本中收获的经验,我们将在beta ...
- JQ001-认识jQuery 和 JQ002-jQuery选择器
JQ001-认识jQuery jQuery环境配置:将jQuery.js文件引入到html页面中即可. 代码如下: <!DOCTYPE html> <html> <hea ...