基于thinkphp3.2.3开发的CMS内容管理系统(二)- Rbac用户权限
基于thinkphp3.2.3开发的CMS内容管理系统
thinkphp版本:3.2.3
功能:
--分类栏目管理
--文章管理
--商品管理
--用户管理
--角色管理
--权限管理
--友情链接管理
--系统设置
目前占时这些功能,更多功能还在开发中...
此次版本新增的有:商品管理、角色管理、权限管理
本篇文章我们主要来看看,Rbac用户权限
RBAC(Role-Based Access Controll)基于角色的访问控制
在 ThinkPHP3.2.3 中 RBAC 类位于 /ThinkPHP/Library/Org/Util/Rbac.class.php
一、Rbac原理和数据表:
在后台管理模块中,每个用户都属于相应的角色组,例如用户 admin 属于超级管理员角色组,用户 dee 属于普通管理员角色组,用户 jane 属于销售角色组,用户 nicole 属于财务角色组,每个角色组拥有的权限都不同。用户和角色组属于多对多的关系,即一个用户可能属于多个角色组,一个角色组有多个用户。
所有模块(例如 Home、Admin)、控制器(Controller)、方法(Action)都是节点,角色组是否能够访问这些节点的信息即是该角色组的权限信息。角色组和节点也是多对多的关系,即一个角色组可以访问多个节点,多个角色组都有可以访问同一个节点。
即 Rbac 功能需要 5 张数据表:用户表、角色表、用户-角色中间表、节点表、角色-节点中间表(权限表)。在 Rbac.class.php 中系统已经给出了其中的 4 张表:角色表(role)、用户-角色中间表(role_user)、节点表(node)、权限表(access):
/*
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `think_access` (
`role_id` smallint(6) unsigned NOT NULL,
`node_id` smallint(6) unsigned NOT NULL,
`level` tinyint(1) NOT NULL,
`module` varchar(50) DEFAULT NULL,
KEY `groupId` (`role_id`),
KEY `nodeId` (`node_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `think_node` (
`id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`title` varchar(50) DEFAULT NULL,
`status` tinyint(1) DEFAULT '0',
`remark` varchar(255) DEFAULT NULL,
`sort` smallint(6) unsigned DEFAULT NULL,
`pid` smallint(6) unsigned NOT NULL,
`level` tinyint(1) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `level` (`level`),
KEY `pid` (`pid`),
KEY `status` (`status`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `think_role` (
`id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`pid` smallint(6) DEFAULT NULL,
`status` tinyint(1) unsigned DEFAULT NULL,
`remark` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `pid` (`pid`),
KEY `status` (`status`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; CREATE TABLE IF NOT EXISTS `think_role_user` (
`role_id` mediumint(9) unsigned DEFAULT NULL,
`user_id` char(32) DEFAULT NULL,
KEY `group_id` (`role_id`),
KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
*/
需要自己创建一张用户表:
CREATE TABLE `crm_user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` char(20) NOT NULL DEFAULT '',
`password` char(32) NOT NULL DEFAULT '',
`logintime` int(10) unsigned NOT NULL,
`loginip` varchar(30) NOT NULL,
`lock` tinyint(1) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
数据模型如下:

基本的原理是,在配置文件中配置用户登录的识别号,这个识别号是用户的 id,在用户进行登陆的时候把 id 存储在 Session 中,同时根据 Session 保存的识别号通过连表查询获取该用户所属角色所能访问的节点信息并做判断。
二、配置选项
在 Rbac.class.php 中给出了需要配置的信息:
// 配置文件增加设置
// USER_AUTH_ON 是否需要认证
// USER_AUTH_TYPE 认证类型
// USER_AUTH_KEY 认证识别号
// REQUIRE_AUTH_MODULE 需要认证模块
// NOT_AUTH_MODULE 无需认证模块
// USER_AUTH_GATEWAY 认证网关
// RBAC_DB_DSN 数据库连接DSN
// RBAC_ROLE_TABLE 角色表名称
// RBAC_USER_TABLE 用户表名称
// RBAC_ACCESS_TABLE 权限表名称
// RBAC_NODE_TABLE 节点表名称
在模块配置文件 ./Application/Admin/Conf/config.php 中添加:
//'配置项'=>'配置值'
'SHOW_PAGE_TRACE'=>true, //显示页面调试Trace信息,默认为false
//Rbac权限访问控制配置
'RBAC_SUPERADMIN'=>'admin', //超级管理员名称
'ADMIN_AUTH_KEY'=>'admin', //超级管理员识别,存放在Session中
'USER_AUTH_ON'=>ture, //是否开启权限认证,false,ture
'USER_AUTH_TYPE'=>1, //验证类型 1-登陆时验证 2-实时验证
'USER_AUTH_KEY'=>'admin_id', //存储在session中的用户识别号ID
'NOT_AUTH_MODULE'=>'Index', //无需验证的控制器
'NOT_AUTH_ACTION'=>'index', //无需验证的方法
'RBAC_ROLE_TABLE'=>'blog_role', //角色表名称
'RBAC_USER_TABLE'=>'blog_role_user', //角色与用户的中间表名称(注意)
'RBAC_ACCESS_TABLE'=>'blog_access', //权限表名称
'RBAC_NODE_TABLE'=>'blog_node', //节点表名称
三、开发实例
需要开发以下功能,顺序是:
①【添加角色 → 角色列表】 →
②【添加节点 → 节点列表】 →
③【权限列表 → 分配权限】 →
④【添加用户 → 用户列表 】 →
⑤【Rbac 配置】→
⑥【登陆】
步骤开始:
①【添加角色 → 角色列表】 →
在后台模块新建 Rbac 控制器:./Application/Admin/Controller/Rbac.class.php
//角色管理
public function role(){
$role = M('Role'); // 实例化对象
$count = $role->where('status=1')->count();// 查询满足要求的总记录数
$Page = new \Think\Page($count,25);// 实例化分页类 传入总记录数和每页显示的记录数(25)
$show = $Page->show();// 分页显示输出
// 进行分页数据查询 注意limit方法的参数要使用Page类的属性
$list = $role->where('status=1')->order('id')->limit($Page->firstRow.','.$Page->listRows)->select();
//var_dump($list);exit;
$this->assign('list',$list);// 赋值数据集
$this->assign('page',$show);// 赋值分页输出
$this->display(); // 输出模板
} //角色添加
public function role_add(){
if(IS_POST){
$m = M("Role");
$data = $m->create();
$res = $m->add($data);
if($res>0){
$this->success('添加成功!',U('role'));
}else{
$this->error('添加失败!');
}
return;
}
$this->display();
} //角色禁用
public function role_delete(){
$m = M('Role');
$id = $_GET['id'];
$res = $m->where("id = {$id}")->setField('status',0);
if($res>0){
$this->success('角色已禁用!',U('role'));
}else{
$this->error('禁用失败!');
}
}


③【权限列表 → 分配权限】 →

②【添加节点 → 节点列表】 →


时间比较仓促,功能可能不太完善,后面会慢慢修改;
后台比较简单,功能不太完整,后续还在陆续增加功能,希望各位大神指点~
日期:2020.5.5
作者:赖忠标
坐标:广州
上一篇文章:基于thinkphp3.2.3开发的CMS内容管理系统(一)
基于thinkphp3.2.3开发的CMS内容管理系统(二)- Rbac用户权限的更多相关文章
- 基于thinkphp3.2.3开发的CMS内容管理系统 - ThinkPHP框架
基于thinkphp3.2.3开发的CMS内容管理系统 thinkphp版本:3.2.3 功能: --分类栏目管理 --文章管理 --用户管理 --友情链接管理 --系统设置 目前占时这些功能,更多功 ...
- 新能力 | 云开发CMS内容管理系统,5分钟搞定小程序管理后台
小程序·云开发的云调用能力,让用户可以免鉴权快速调用微信的开放能力,极大节约了开发成本.现在,大家期待已久的云开发 CMS 内容管理系统,终于上线啦!顺便提示,接下来还可以二次开发哦! 云开发 CMS ...
- 30 个很棒的 PHP 开源 CMS 内容管理系统
本文汇集了30个优秀的开源CMS建站系统,采用PHP开发.以下列表不分先后顺序. 1. AdaptCMS AdaptCMS Lite 是一个开源的CMS系统,主要特点是易用,而且可以轻松和其他系统接驳 ...
- 贝云cms内容管理系统(thinkphp5.0开源cms管理系统)
byCms包含文章,图片,下载,视频模型,基于thinkphp5.0.9,可无缝升级至thinkphp.1.0,是一套简单,易用的内容管理系统,旨在帮助开发者节约web应用后台开发时间和精力,以最快的 ...
- 推荐八款.Net优秀的开源CMS 内容管理系统
1,老牌内容管理系统SiteServer CMS 推荐指数:5 SiteServer CMS 是.NET平台的CMS系统,也是一款拥有十年历史与广泛知名度的CMS系统,2017年5月初迈出了自成立以 ...
- 八大CMS内容管理系统推荐
cms系统哪个好 感谢 64320 的投递 时间:2015-03-05 来源:http://www.iisp.com/ztview/ID_16129.html?s=bios 耐思尼克 很多新手站长初次 ...
- .Net Core 3.0开源可视化设计CMS内容管理系统建站系统
简介 ZKEACMS,又名纸壳CMS,是可视化编辑设计的内容管理系统.基于.Net Core开发可跨平台运行,并拥有卓越的性能. 纸壳CMS基于插件式设计,功能丰富,易于扩展,可快速创建网站. 布局设 ...
- 开源丨CloudBase CMS 内容管理系统!简单易用企业内容管理流
背景 云开发CloudBase CMS 是云开发推出的一站式云端内容管理系统,助力企业的数据运营管理工作. 开发者可以直接在云开发扩展能力中一键安装 CloudBase CMS,免费使用 CloudB ...
- 初次认识dedecms和帝国cms内容管理系统
近乎完美的内容模块管理 强大的内容管理系统,细致入微 其原理都是 先建立一个 模板系统 然后动态生成静态页面 注意各个板块和栏目的设置 在迁移网站的时候 尤其需要注意的是 系统参数的 根目录 需要及 ...
随机推荐
- System.out.println()的真实含义
每一个人的Java学习之路上恐怕都是用以下代码开始的吧? public class Test { public static void main(String[] args) { System.out ...
- shell脚本编程(ubantu)
项目 内容 这个作业属于那个课程 这里是链接 作业要求在哪里 这里是链接 学号-姓名 17041506-张政 作业学习目标 了解shell脚本的概念及使用:掌握shell脚本语言的基本语法:学习简单的 ...
- AJ学IOS 之微博项目实战(4)微博自定义tabBar中间的添加按钮
AJ分享,必须精品 一:效果图 自定义tabBar实现最下面中间的添加按钮 二:思路 首先在自己的tabBarController中把系统的tabBar设置成自己的tabBar(NYTabBar),这 ...
- (一) Mybatis源码分析-解析器模块
Mybatis源码分析-解析器模块 原创-转载请说明出处 1. 解析器模块的作用 对XPath进行封装,为mybatis-config.xml配置文件以及映射文件提供支持 为处理动态 SQL 语句中的 ...
- Labview 机器视觉IMAQ GetFileInfo函数详解
------------恢复内容开始------------ IMAQ GetFileInfo作用是获取图片文件的信息,包括Calibration(校准).文件类型.水平垂直分辨率.文件数据类型.图像 ...
- jdk动态代理:由浅入深理解mybatis底层
什么是代理 代理模式,目的就是为其他对象提供一个代理以控制对某个对象的访问,代理类为被代理者处理过滤消息,说白了就是对被代理者的方法进行增强. 看到这里,有没有感觉很熟悉?AOP,我们熟知的面向切面编 ...
- CAS原理解析
CAS底层原理 概念 CAS的全称是Compare-And-Swap,它是CPU并发原语 它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的 CAS并发原语体现在Jav ...
- SpringBoot集成MyBatis底层原理及简易实现
MyBatis是可以说是目前最主流的Spring持久层框架了,本文主要探讨SpringBoot集成MyBatis的底层原理.完整代码可移步Github. 如何使用MyBatis 一般情况下,我们在Sp ...
- Java中Character类
Character 类在对象中包装一个基本类型char的值此外,该类提供了几种方法,以确定字符的类别(小写字母,数字,等),并将字符从大写转小写,反之亦然. 构造方法: Character(char ...
- 负载均衡服务之HAProxy基础配置(三)
前文我们聊到了haproxy的代理配置段中比较常用的配置指令的用法以及说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12770930.html:今天我们来 ...