是先设计mysql表再进行php代码_PHP与RBAC设计思路,数据表设计与源码讲解
权限系统模块对于互联网产品是一个非常重要的功能,可以控制不同的角色合理的访问不同的资源从而达到安全访问的作用
权限控制有哪些模型ACL
RBAC 基于角色的访问控制
从上图我们可以看出,ACL是用户和权限直接关系的,而RBAC则是通过角色间接关联用户和权限的。所以我们注意到角色是RBAC系统的一个重要属性。
什么是RBAC模型
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。
为什么要选择RBAC模型
原因如下:方便用户分组
方便权限分配和回收
扩展方便,可以满足大部分业务需求
这些也就是我们在说权限管理前,应该先知道权限管理要有功能。
RBAC模型的关系图
图中有重要的RBAC模型5大属性,分别是:
1 用户属性(张三、李四、王五)
2 角色属性(销售经理、销售、前台)
3 用户与角色的关系(张三 是 销售经理 、李四 王五 是 销售)
4 权限(添加客户、编辑客户、删除客户,查看客户)
5 权限与角色的关系(销售 拥有 查看客户的 权 限、销售经理可以 查看/添加/删除/编辑客户的)
一个RBAC权限模块,必然要实现三个功能用户管理
用户列表
添加用户
编辑用户
设置用户角色
角色管理 角色列表
添加角色
编辑角色
设置角色权限
权限管理
权限列表
新增权限
编辑权限
如图所示
数据表设计
用户表
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL DEFAULT '' COMMENT '姓名',
`email` varchar(30) NOT NULL DEFAULT '' COMMENT '邮箱',
`is_admin` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否是超级管理员 1表示是 0 表示不是',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 1:有效 0:无效',
`updated_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '最后一次更新时间',
`created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '插入时间',
PRIMARY KEY (`id`),
KEY `idx_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';
角色表
CREATE TABLE `role` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '角色名称',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 1:有效 0:无效',
`updated_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '最后一次更新时间',
`created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '插入时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色表';
用户角色表
CREATE TABLE `user_role` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL DEFAULT '0' COMMENT '用户id',
`role_id` int(11) NOT NULL DEFAULT '0' COMMENT '角色ID',
`created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '插入时间',
PRIMARY KEY (`id`),
KEY `idx_uid` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户角色表';
权限详情表
CREATE TABLE `access` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(50) NOT NULL DEFAULT '' COMMENT '权限名称',
`urls` varchar(1000) NOT NULL DEFAULT '' COMMENT 'json 数组',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 1:有效 0:无效',
`updated_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '最后一次更新时间',
`created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '插入时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='权限详情表';
角色权限表
CREATE TABLE `role_access` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`role_id` int(11) NOT NULL DEFAULT '0' COMMENT '角色id',
`access_id` int(11) NOT NULL DEFAULT '0' COMMENT '权限id',
`created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '插入时间',
PRIMARY KEY (`id`),
KEY `idx_role_id` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色权限表';
用户操作记录表
CREATE TABLE `app_access_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` bigint(20) NOT NULL DEFAULT '0' COMMENT '品牌UID',
`target_url` varchar(255) NOT NULL DEFAULT '' COMMENT '访问的url',
`query_params` longtext NOT NULL COMMENT 'get和post参数',
`ua` varchar(255) NOT NULL DEFAULT '' COMMENT '访问ua',
`ip` varchar(32) NOT NULL DEFAULT '' COMMENT '访问ip',
`note` varchar(1000) NOT NULL DEFAULT '' COMMENT 'json格式备注字段',
`created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_uid` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户操作记录表';
代码实现
本系统所有页面都是需要登录之后才能访问的, 在框架中加入统一验证方法
public function beforeAction($action) {
$login_status = $this->checkLoginStatus();
if ( !$login_status && !in_array( $action->uniqueId,$this->allowAllAction ) ) {
if(Yii::$app->request->isAjax){
$this->renderJSON([],"未登录,请返回用户中心",-302);
}else{
$this->redirect( UrlService::buildUrl("/user/login") );//返回到登录页面
}
return false;
}
//保存所有的访问到数据库当中
$get_params = $this->get( null );
$post_params = $this->post( null );
$model_log = new AppAccessLog();
$model_log->uid = $this->current_user?$this->current_user['id']:0;
$model_log->target_url = isset( $_SERVER['REQUEST_URI'] )?$_SERVER['REQUEST_URI']:'';
$model_log->query_params = json_encode( array_merge( $post_params,$get_params ) );
$model_log->ua = isset( $_SERVER['HTTP_USER_AGENT'] )?$_SERVER['HTTP_USER_AGENT']:'';
$model_log->ip = isset( $_SERVER['REMOTE_ADDR'] )?$_SERVER['REMOTE_ADDR']:'';
$model_log->created_time = date("Y-m-d H:i:s");
$model_log->save( 0 );
/**
* 判断权限的逻辑是
* 取出当前登录用户的所属角色,
* 在通过角色 取出 所属 权限关系
* 在权限表中取出所有的权限链接
* 判断当前访问的链接 是否在 所拥有的权限列表中
*/
//判断当前访问的链接 是否在 所拥有的权限列表中
if( !$this->checkPrivilege( $action->getUniqueId() ) ){
$this->redirect( UrlService::buildUrl( "/error/forbidden" ) );
return false;
}
return true;
}
检查是否有访问指定链接的权限
public function checkPrivilege( $url ){
//如果是超级管理员 也不需要权限判断
if( $this->current_user && $this->current_user['is_admin'] ){
return true;
}
//有一些页面是不需要进行权限判断的
if( in_array( $url,$this->ignore_url ) ){
return true;
}
return in_array( $url, $this->getRolePrivilege( ) );
}
获取某用户的所有权限,取出指定用户的所属角色, 在通过角色取出所属权限关系,在权限表中取出所有的权限链接
public function getRolePrivilege($uid = 0){
if( !$uid && $this->current_user ){
$uid = $this->current_user->id;
}
if( !$this->privilege_urls ){
$role_ids = UserRole::find()->where([ 'uid' => $uid ])->select('role_id')->asArray()->column();
if( $role_ids ){
//在通过角色 取出 所属 权限关系
$access_ids = RoleAccess::find()->where([ 'role_id' => $role_ids ])->select('access_id')->asArray()->column();
//在权限表中取出所有的权限链接
$list = Access::find()->where([ 'id' => $access_ids ])->all();
if( $list ){
foreach( $list as $_item ){
$tmp_urls = @json_decode( $_item['urls'],true );
$this->privilege_urls = array_merge( $this->privilege_urls,$tmp_urls );
}
}
}
}
return $this->privilege_urls ;
}
链接:http://www.startphp.cn/front/php/112730.html
作者:leifeng以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家
最后,祝所有大家在面试中过关斩将,拿到心仪offer。如果想与一群3-8年资深开发者一起交流学习的话,需要请戳这里shimo.im
是先设计mysql表再进行php代码_PHP与RBAC设计思路,数据表设计与源码讲解相关推荐
- mysql的select复合查询语法_MySQL(九)之数据表的查询详解(SELECT语法)二
上一篇讲了比较简单的单表查询以及MySQL的组函数,这一篇给大家分享一点比较难得知识了,关于多表查询,子查询,左连接,外连接等等.希望大家能都得到帮助! 在开始之前因为要多表查询,所以搭建好环境: 1 ...
- 顾客信息表mysql_Qt5.5.0使用mysql编撰小软件源码讲解-顾客信息登记表_mysql
Qt5.5.0使用mysql编写小软件源码讲解---顾客信息登记表 Qt5.5.0使用mysql编写小软件源码讲解---顾客信息登记表 一个个人觉得比较简单小巧的软件. 下面就如何编写如何发布打包来介 ...
- sql数据表改为自动递增显示与其他表关联_MySQL萌新第一季 第四话-数据表的基本操作...
本话旨在完成以下内容: 在数据库中,数据表是数据库中最重要和基本的操作对象,是数据存储的基本单位.换句话说我们操作数据库其实重要的就是操作数据表.本章将详细介绍数据表的基本操作,主要内容包括:创建数据 ...
- 查看ie保存的表单_无代码搭建系统(一)——流程表单搭建
迎着2020疫情带来的线上办公.远程协同办公,把无代码带上风口浪尖,众多无代码厂商迅速发展起来,推出自己的无代码产品.实现全民开发,是无代码发展的愿景和目标.数字化和网络化使各行各业的客户对应用开发的 ...
- 基于Java毕业设计大数据文章发布系统源码+系统+mysql+lw文档+部署软件
基于Java毕业设计大数据文章发布系统源码+系统+mysql+lw文档+部署软件 基于Java毕业设计大数据文章发布系统源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 ...
- 40套各种风格游戏行业网站html5模板wap手机游戏资讯网站模板游戏动漫设计公司html模板游戏公司网站模板html5网页静态模板Bootstrap扁平化网站源码css3手机seo自适响应
40套各种风格游戏行业网站html5模板wap手机游戏资讯网站模板游戏动漫设计公司html模板游戏公司网站模板html5网页静态模板Bootstrap扁平化网站源码css3手机seo自适响应. 不仅仅 ...
- 是先设计mysql表再进行php代码_MySQL设计与开发规范_MySQL
1 目的 本规范的主要目的是希望规范数据库设计与开发,尽量避免由于数据库设计与开发不当而产生的麻烦:同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好保证. 2 适用范围 本规划的 ...
- phpstudy mysql创建表_MySQL_Mysql入门基础 数据库创建篇,1.创建数据表---基础(高手跳 - phpStudy...
Mysql入门基础 数据库创建篇 1.创建数据表---基础(高手跳过) 正统方法:create [TEMPORARY] table 表名 [if not exists] (创建的列项定义) [表的选项 ...
- MySQL排序ORDER BY与分页LIMIT,SQL,减少数据表的网络传输量,完整详细可收藏
文章目录 1.ORDER BY排序 2.LIMIT分页 1.ORDER BY排序 1.1 排序规则 使用 ORDER BY 子句排序 ASC(ascend): 升序 DESC(descend):降序 ...
最新文章
- Vim使用技巧及基本命令分类
- 大型网站的灵魂——性能优化
- Technet:服务器虚拟化备份和灾难恢复
- 班门弄斧?基于BCE的Lightningspin应用对比ChainBet
- 两个时间计算毫秒在线_SPL 的日期时间函数(下)
- 581. 最短无序连续子数组 golang
- 计算机控制pud,控制系统状态空间实施方案计算机控制技术课程实施方案
- 导航网站完整程序源码
- pthread_getspecific和pthread_setspecific使用:同一线程内的各个函数间共享数据
- mysql分区表检验,MySQL分区表管理
- html5 paint,html5实现仿windows画图工具的画图工具jspaint
- [老文档2016]一种后台管理智能杀进程的规则与方法
- SSL P2133 腾讯大战360 题目
- 脚本小子进阶之路(一)用开源武装自己
- 第二讲:项目运行环境 事业环境因素 (EEF) 和组织过程资产 (OPA)
- Elasticsearch的搜索命令
- MySQL 自定义stuff函数
- android pay 机型,苹果有ApplePay,那你知道这些安卓机Pay吗
- PPC扑克牌游戏开发实录 第一篇 之 全屏
- 基于hbuilder开发的微信小程序音乐播放系统,可添加本地音乐(含源码)
热门文章
- [html] 举例说明当我们在写布局时,都有哪些边界的情况需要关注的?
- [html] 可以给内联元素设置宽和高吗?为什么?
- [html] html元素哪些标签是不可替换元素?哪些是可替换元素?
- [css] 遇到overflow: scroll不能平滑滚动怎么解决?
- [css] 你有去看过或者了解过css的标准文档吗?
- 前端学习(2672): vue3.0脚手架路由改变
- 前端学习(1333):mongodb增
- mybatis学习(26):插入功能(插入数据)
- mysql 写入慢_MySQL主从,你遇到过哪些问题?
- activiti高亮显示图片_【正点原子FPGA连载】第二十章SD卡读BMP图片HDMI显示实验领航者 ZYNQ 之嵌入式开发指南...