ThinkPHP RBAC权限管理机制
RBAC是ThinkPHP很好用的后台权限管理的,话不多说,实现方法如下,也方便以后自己查询使用:
1、新建4个数据库表
self_role权限表
CREATE TABLE `self_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 AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; INSERT INTO `self_role` VALUES ('', '超级管理员', '', '', '超级管理权限');
INSERT INTO `self_role` VALUES ('', '普通管理员', '', '', '普通管理权限');
INSERT INTO `self_role` VALUES ('', '注册用户', '', '', '注册管理权限');
self_role_user表:权限(self_role)与用户表(self_user)的关系表
CREATE TABLE `self_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; INSERT INTO `self_role_user` VALUES ('', '');
INSERT INTO `self_role_user` VALUES ('', '');
self_node表:权限分配表
CREATE TABLE `self_node` (
`id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`title` varchar(50) DEFAULT NULL,
`status` tinyint(1) DEFAULT '',
`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 AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; INSERT INTO `self_node` VALUES ('', 'Admin', '后台项目', '', '项目权限', '', '', '');
INSERT INTO `self_node` VALUES ('', 'Index', '默认控制模块', '', '控制器', '', '', '');
INSERT INTO `self_node` VALUES ('', 'index', '默认操作', '', '操作动作', '', '', '');
INSERT INTO `self_node` VALUES ('', 'User', '用户控制模块', '', '控制器', '', '', '');
INSERT INTO `self_node` VALUES ('', 'Section', '单元控制模块', '', '控制器', '', '', '');
INSERT INTO `self_node` VALUES ('', 'index', '用户默认操作', '', '操作动作', '', '', '');
INSERT INTO `self_node` VALUES ('', 'add', '用户添加操作', '', '操作动作', '', '', '');
INSERT INTO `self_node` VALUES ('', 'index', '单元默认操作', '', '操作动作', '', '', '');
INSERT INTO `self_node` VALUES ('', 'add', '单元添加操作', '', '操作动作', '', '', '');
self_access表:self_node与self_role的关系表(重点分析好这个表)
CREATE TABLE `self_access` (
`role_id` smallint(6) unsigned NOT NULL,
`node_id` smallint(6) unsigned NOT NULL,
`level` tinyint(1) NOT NULL,
`pid` varchar(50) DEFAULT NULL,
KEY `groupId` (`role_id`),
KEY `nodeId` (`node_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `self_access` VALUES ('', '', '', '');
INSERT INTO `self_access` VALUES ('', '', '', '');
INSERT INTO `self_access` VALUES ('', '', '', '');
INSERT INTO `self_access` VALUES ('', '', '', '');
INSERT INTO `self_access` VALUES ('', '', '', '');
INSERT INTO `self_access` VALUES ('', '', '', '');
INSERT INTO `self_access` VALUES ('', '', '', '');
INSERT INTO `self_access` VALUES ('', '', '', '');
INSERT INTO `self_access` VALUES ('', '', '', '');
INSERT INTO `self_access` VALUES ('', '', '', '');
INSERT INTO `self_access` VALUES ('', '', '', '');
2、配置后台配置文件/Admin/Conf
'USER_AUTH_ON'=>true,//开启RBAC权限认证
'USER_AUTH_TYPE'=>1,//使用session进行标记
'USER_AUTH_KEY'=>'authId',//设置session标记名称
'ADMIN_AUTH_KEY'=>'administrator',//设置管理员用户标记
'USER_AUTH_MODEL'=>'User',//验证用户的表模型
//'AUTH_PWD_ENCODER'=>'md5',//用户认证密码加密方式
'USER_AUTH_GATEWAY'=>'/Public/login',//默认的认证网关
'NOT_AUTH_MODULE'=>'Public',//默认不需要认证的控制模块
'REQUIRE_AUTH_MODULE'=>'',//默认需要认证的模块
'NOT_AUTH_ACTION'=>'',//默认不需要认证的动作
'REQUIRE_AUTH_ACTION'=>'',//默认需要认证的动作
'GUEST_AUTH_ON'=>false,//是否开启游客授权访问
'GUEST_AUTH_ID'=>0,//游客标记 'RBAC_ROLE_TABLE'=>'self_role',
'RBAC_USER_TABLE'=>'self_role_user',
'RBAC_ACCESS_TABLE'=>'self_access',
'RBAC_NODE_TABLE'=>'self_node',
3、公共控制器上进行验证:
class CommonAction extends Action{
function _initialize(){
header('Content-Type:text/html;charset=utf-8');
//第一步:判断是否开启了认证 判断当前模块是否需要认证
if(C('USER_AUTH_ON') && !in_array(MODULE_NAME,explode(',',C('NOT_AUTH_MODULE')))){
//第二步:开启认证,导入RBAC类
import('ORG.Util.RBAC');
//判断不通过认证
if(!RBAC::AccessDecision()){
//第三步:当认证不通过是该如何处理
//判断session中是否存放了用户标记
if(!$_SESSION[C('USER_AUTH_KEY')]){
//用户没有登陆
$this->assign('jumpUrl',__APP__.'/Public/login');
$this->error('对不起,您没有登陆,请登录');
}//else //代表用户已经登陆 //判断是否开启了游客登陆功能
if(C('GUEST_AUTH_ON')){
//开启则跳转到游客页面
}
$this->error('对不起您没有操作权限');
}//else 认证通过了
}//else 没有开启认证或者当前模块不需要认证,则通过
}
}
4、新建Public控制器PublicAction.class.php
class PublicAction extends Action{
function login(){
$this->display();
}
function verify(){
import('ORG.Util.Image');
Image::buildImageVerify();
}
function checklogin(){
//检查表单数据的有效性 用户名 密码 验证码必须填写
if(empty($_POST['username'])){
$this->error('用户名必须填写');
}
if(empty($_POST['password'])){
$this->error('密码必须填写');
}
if(empty($_POST['verify'])){
$this->error('验证码必须填写');
}
//整理需要用户验证的数据
$map = array();
$map['username'] = $_POST['username'];
$map['active'] = array('gt',0);
if($_SESSION['verify'] !== md5($_POST['verify'])){
$this->error('验证码输入错误');
} //RBAC验证
import('ORG.Util.RBAC');
//提取用户数据
$user = RBAC::authenticate($map);
//判断是否能提取用户数据
if(empty($user)){
$this->error('用户不存在或者被禁用');
}else{
//如果数据提取成功,判断密码是否输入正确
//注意:post中的密码要经过md5加密后再跟数据库中的密码进行比较
if($user['password'] != $_POST['password']){
$this->error('用户密码输入错误');
}//else 密码验证通过 //保存session的会话标识,用来后面判断用户已经登录的状态
$_SESSION[C('USER_AUTH_KEY')] = $user['id'];//把用户id存入session
//存储后面需要用到的数据,如email 和登录时间等等
$_SESSION['email'] = $user['email'];
//超级管理身份验证
if($user['admin'] == 'admin'){
$_SESSION[C('ADMIN_AUTH_KEY')] = true;
} //保存本用户的登录信息
$u = M('User');
$lastdate = date('Y-m-d H:i:s');
$row['id'] = $user['id'];
$row['last_login_date'] = $lastdate;
$u->save($row);
//缓存访问权限
RBAC::saveAccessList();
//页面登录成功的跳转
$this->assign('jumpUrl',__APP__.'/Index/index');
$this->success('登录成功');
}
}
function logout(){
//判断用户是否正在登录
if(!empty($_SESSION[C('USER_AUTH_KEY')])){
//正在登录中..
unset($_SESSION[C('USER_AUTH_KEY')]);
$_SESSION = array();
session_destroy();
$this->assign('jumpUrl',__URL__.'/login');
$this->success('登出成功');
}else{
//已经登出了
$this->error('已经登出了');
}
}
}
5、建立success.html和login.html模板
success.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>selfcms 系统信息提示</title>
</head> <body>
<h1>{$msgTitle}</h1>
<h2>{$message}</h2>
<h3>
系统将在<font color="#FF0000">{$waitSecond}</font>秒后自动跳转,如果不想等待,请
<a href="{$jumpUrl}">点击这里</a>跳转
</h3>
</body>
</html>
login.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>login</title>
</head> <body>
<form action="__URL__/checklogin" method="post">
用户名:<input type="text" name="username" /><br>
密码:<input type="password" name="password" /><br>
验证码:<input type="text" name="verify" /><img src="__URL__/verify" alt="验证码" /><br>
<input type="submit" value="登录" />
</form>
</body>
</html>
6、登出
<a href="__APP__/Public/logout">登出</a>
ThinkPHP RBAC权限管理机制的更多相关文章
- ThinkPHP中RBAC权限管理的简单应用
RBAC英文全称(Role-Based Access Controller)即基于角色的权限访问控制,简单来讲,一个用户可以拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色-权限”的授 ...
- Spring Security实现RBAC权限管理
Spring Security实现RBAC权限管理 一.简介 在企业应用中,认证和授权是非常重要的一部分内容,业界最出名的两个框架就是大名鼎鼎的 Shiro和Spring Security.由于Spr ...
- RBAC权限管理模型 产品经理 设计
RBAC权限管理模型:基本模型及角色模型解析及举例 | 人人都是产品经理http://www.woshipm.com/pd/440765.html RBAC权限管理 - PainsOnline的专栏 ...
- yii2 rbac权限管理学习笔记
下面介绍一个 yii2 的 Rbac 权限管理设置,闲话少说,直接上代码, 1.首先我们要在组件里面配置一下 Rbac ,如下所示(common/config/main-local.php或者main ...
- vue基于d2-admin的RBAC权限管理解决方案
前两篇关于vue权限路由文章的填坑,说了一堆理论,是时候操作一波了. vue权限路由实现方式总结 vue权限路由实现方式总结二 选择d2-admin是因为element-ui的相关开源项目里,d2-a ...
- Android开发——Android 6.0权限管理机制详解
.Android 6.0运行时主动请求权限 3.1 检测和申请权限 下面的例子介绍上面列出的读写SD卡的使用例子,可以使用以下的方式解决: public boolean isGrantExterna ...
- PHP中RBAC权限管理
1.RBAC概念和原理 RBAC:全称叫做Role-Based Access Control,中文翻译叫做基于角色的访问控制.其主要的作用是实现项目的权限控制. ...
- 基于RBAC权限管理的后台管理系统
在摸爬滚打中渐渐理解了RBAC权限管理是个什么玩意. RBAC的基本概念: **RBAC认为权限授权实际上是Who.What.How的问题.在RBAC模型中,who.what.how构成了访问权限三元 ...
- spring boot:spring security用mysql数据库实现RBAC权限管理(spring boot 2.3.1)
一,用数据库实现权限管理要注意哪些环节? 1,需要生成spring security中user类的派生类,用来保存用户id和昵称等信息, 避免页面上显示用户昵称时需要查数据库 2,如果需要在页面上显示 ...
随机推荐
- AC日记——小行星 洛谷 P2711
题目背景 pid=3437 题目描述 星云中有n颗行星,每颗行星的位置是(x,y,z).每次可以消除一个面(即x,y或z坐标相等)的行星,但是由于时间有限,求消除这些行星的最少次数. 输入输出格式 输 ...
- Codeforces 599E Sandy and Nuts(状压DP)
题目链接 Sandy and Nuts 题意大概就是给出限制条件求出在该限制条件下树的种数. #include <bits/stdc++.h> using namespace std; # ...
- C++: 多态 虚函数
一.多态: 1.多态是什么:具有不同功能的函数可以用同一个函数名 2.静态多态:程序编译时决定,通过函数重载实现. 3.动态多态:程序运行时决定,通过虚函数实现. 二.虚函数: 1.引入目的:可以通过 ...
- 关于udo3d双目相机的嵌入式板子系统重装
遇到的问题: 1.下载压缩文件(.rar):在linux下下载一会就会停止 原因:linux下不支持.rar文件的下载,在windows下载即可 2.在windows下解压文件,结果为镜像文件(.im ...
- 手机微硬盘读取速度>50MB/s eMMC技术浅析
转载:http://mobile.zol.com.cn/296/2968659_all.html#p2968659 手机微硬盘读取速度>50MB/s 在开始今天的话题之前,请大家随笔者一起时光倒 ...
- Android 自定义录音、播放动画View,让你的录音浪起来
最近公司项目有一个录音的录制和播放动画需求,然后时间是那么紧,那么赶紧开撸. 先看效果图 嗯,然后大致就是这样,按住录音,然后有一个倒计时,最外层一个进度条,还有一个类似模拟声波的动画效果(其实中间的 ...
- 织梦dedecms 去掉后台登陆验证码的方法
那么有什么办法解决呢? 那么现在就给大家解决织梦去掉后台登陆验证码. 这里面分两种版本 一个是织梦5.6的程序 那么织梦5.6程序的解决办法是: 在织梦DedeCms5.6版本可以通过下面路径对验 ...
- sublime的tab和spaces空格切换的坑
python是严格要求对齐或者叫缩进的: 使用sublime对python进行编程时,可以使用tab或者空格,但是不能混用.特别是从外面把代码拷贝进sublime的时候,更要注意是否一致. 简单介绍一 ...
- python matplotlib 绘图 和 dpi对应关系
dpi=1 600×400 dpi=2 1200×800 dpi=3 1800×1200 ........ dpi=21 (21×600)×(21×400) ---> 12600×8400 示例 ...
- 转:android studio入门合集
http://blog.csdn.net/column/details/zsl-androidstudio.html