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. apache服务器启动时提示httpd: apr_sockaddr_info_get() failed for

    apache服务器启动时提示httpd: apr_sockaddr_info_get() failed for 在RedHat Linux 5 与 CentOS 5服务器上配置好apache后,启动或 ...

  2. PAT 1038. 统计同成绩学生(20)

    本题要求读入N名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式: 输入在第1行给出不超过105的正整数N,即学生总人数.随后1行给出N名学生的百分制整数成绩,中间以空格分隔.最后1行给出要查 ...

  3. Spring.net使用说明

    使用方法: 1.在配置文件设置Spring.net 节点  在配置节中,声明Spring.net,配置 context,objects 标签,来源(type) <!--配置节:主要用来 配置 a ...

  4. iOS中UI阶段常用的一些方法

    UI 即 UserInterface(用户界面 1.iOS系统版本,每年都有更新.对我们开发者而言,主要的是观察API的变化. 2.iPhone新手机发布,会产生不同尺寸的屏幕,现在市面上有4种尺寸, ...

  5. 跳转Activity两种方法

    摘要:假设从A界面开启另外一个B界面根据是否需要返回数据分为两种方式 一.无需返回数据方式 在A界面中调用startActivity方法进行直接跳转即可 二.需要返回数据方式 1.在A界面中调用sta ...

  6. jeecg小吐槽

    1.online开发出来的表单,字段中设置的默认值,新建表单的时候不会出来,要保存后才会在后台补加进去!(为时已晚吧) 2.online开发出来的表单,主表中的附表,在online配置界面指定了可以为 ...

  7. pptpd

    18. pptp Server Administration This section covers a few tricks on pptp server management. It is far ...

  8. download ncRNA sequences form NCBI

    #!/bin/bash usage() { echo;echo "Usage: ./`basename $0` [gi number list] [number of cpu]"; ...

  9. 初识Jsoup之解析HTML

    按照国际惯例,我首先应该介绍下Jsoup是个什么东西,然后在介绍下具体用法,然后在来个demo演示,其实我也是这么想的,小编今天花了一天的时间从学习—>解析页面,总算是成果圆满了吧,啊哈,但是, ...

  10. php 实用例子:购物车 涉及session与ajax

    login: <div>用户名:<input type="text" id="uid" /></div><div> ...