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 email varchar(40) YES Email
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权限系统的更多相关文章

  1. TP支持菜单动态生成RBAC权限系统数据库结构设计方案

    最简单基于RBAC权限系统数据库结构设计 包括如下几个表 1. 用户表 -- Table "t_user" DDL CREATE TABLE `t_user` ( `id` int ...

  2. Thinkphp3.2.3中的RBAC权限验证

    最近在用TP的RBAC权限控制,在这里记录学习一下.先来看看相关的概念 一.相关概念 访问控制与RBAC模型1.访问控制:        通常的多用户系统都会涉及到访问控制,所谓访问控制,是指通过某种 ...

  3. 如何在数据库中进行RBAC权限应用

    上周我们发了一篇关于"删库跑路"引发了大家对于数据安全的思考,而权限管理又跟数据安全密不可分.权限管理作为数据系统的重要组成部分,通过控制账号的可支配能力,防止因用户操作不当导致的 ...

  4. ThinkPHP中:RBAC权限控制的实习步骤

    使用版本ThinkPHP3.1.3 第一步,建表及数据 第二步,建关联模型 第三步,控制器使用关联模型.配置文件 第四步,模板显示数据 第一步,建表及数据 在数据库中,建立一个companysvn数据 ...

  5. 基于SSM的RBAC权限系统(1)-利用ajax,bootstrap,ztree完成权限树功能

    仅支持回显以及选择,不支持在树中的编辑 搭建后台回显以及修改的模块 JSON数据封装 public class Msg { private int code; private String msg; ...

  6. CRM项目之RBAC权限组件-day26

    写在前面 上课第26天,打卡: 世间安得双全法 不负如来不负卿 s17day26 CRM项目 项目概要:XX公司CRM - 权限管理,公共组件,app ***** - 熟悉增删改查,Low *** - ...

  7. 权限系统与RBAC模型概述

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3793894.html ...

  8. 权限系统与RBAC模型概述[绝对经典]

    0. 前言 一年前,我负责的一个项目中需要权限管理.当时凭着自己的逻辑设计出了一套权限管理模型,基本原理与RBAC非常相似,只是过于简陋.当时google了一些权限管理的资料,从中了解到早就有了RBA ...

  9. ThinkPHP中RBAC权限带菜单栏显示和详细权限操作

    RBAC是什么,能解决什么难题? RBAC是Role-Based Access Control的首字母,译成中文即基于角色的权限访问控制,说白了也就是用户通过角色与权限进行关联[其架构灵感来源于操作系 ...

随机推荐

  1. android第一行代码-2.activity基本用法

    摘要: 本节主要涉及到的有activity的创建,标题栏隐藏,button绑定方法(toast的使用),menu使用,活动销毁 1.activity的创建跟注册 创建: public class Te ...

  2. Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds...

    仰天长啸   Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds... 当启动tomcat时候出现 ...

  3. JS数组去重比较

    数组去重复是一个常见的需求,我们暂时考虑同类型的数组去重复.主要是理清思路和考虑执行性能. for循环删除后面重复的 var uniqueFor = function(arr) { for (var ...

  4. ReactNative新手学习之路07ListView_ renderHeader使用StaticContainer

    react native新手学习之路07ListView_ renderHeader使用StaticContainer 1.某些特殊场景需要用ScrollView滚动和ListView配合但是不幸运的 ...

  5. FineUI(专业版)v2.6.0即将支持的两个新特性!

    特性1:以一挡三,将 160 行代码缩减为 60 行的技巧! 为了更新单元格的编辑值,我们需要下面三个函数同时上阵: GetModifiedDict:修改的单元格值 GetDeletedList:删除 ...

  6. 为什么目前没有"成熟"的cookie插件?

    一.序言 最近真是挺忙的啊,导致也挺久没有时间来看看园中各位大神的文章,只能感慨业务真尼玛的多,所以在此写下一篇文章来大话最近工作和学习上面的一点点收获体会,希望大家能够有所收获,这篇文章虽然说是一篇 ...

  7. 隐式意图启动一个Activity

    隐式意图是通过指定一组动作或者属性实现,主要用于跨应用使用. 1.创建一个意图对象 Intent intent = new Intent(); 2.设置意图过滤器 intent.setAction(& ...

  8. CentOS 6.5安装在VMWare中Bridge模式下网卡eth0不能自动激活的问题

    VMWare 12.5.2 CentOS 6.5 basic VMWare网卡配置选择Bridge方式 问题: 默认情况下ifconfig命令只能看到网络设备lo,看不到eth0,也没有分配合理的IP ...

  9. Thinking in java学习笔记之持有对象总结

  10. mysql中now()函数的使用,还有oracle的sysdate,可能埋下的坑

    mysql中now()函数的使用,还有oracle的sysdate 在需求中如果系统中药添加当前操作的时间那么很简单的一个操作在写sql的时候直接在这个字段对应的位置写上now()函数就可以了,这样就 ...