原文地址:https://blog.csdn.net/u013090676/article/details/77893237

说起php的权限,很多人都容易想起rbac,这里不多介绍。下面介绍一种通用的权限设计:

首先我们设定一种场景,我们为一个商城做了一个权限系统,商城里有许多店铺,每个店铺有店长和店员,商城还有运营助理帮忙管理这些店铺。

一、基础表:

店铺表,这里只取店铺的id和name。

菜单表,这里取每个菜单的 模块/控制器/方法 和名称,

角色表,主要用在分配角色的时候,我们约定,level越低权限等级越高,权限分配的时候,只能由高等级向下分配。比如:店长可以给

店员分配权限,但是不能给运营助理和其他店长分配权限。运营助理可以给店长和店员分配权限。

二、权限分配

权限分配的界面如上图,这个没什么好说的。

权限分配时,主要要解决的问题是,当前用户能给哪些用户分配哪些权限。我们这里的设计是:

1、当前用户只能给等级比自己低(level大于自己)的人分配权限;

2、当前用户只能给权限范围比自己小或者相同的人分配权限,比如,2号店的店长只能为2号店的店员分配权限,不能给1号店的店员分配

3、当前用户只能分配自己有的权限,比如,2号店长只有订单管理的权限,那他只能分配订单管理这个菜单给店员,不能分配会员信息给

店员,同理,负责2号3号店的运营助理只能分配2号店给某店长,不能分配1号店给某店长。

上图是一个分配结果。用户1是运营助理,负责1号2号店铺,有1到3所有的菜单的权限。用户2是2号店店长,有1到3菜单的权限。

Ⅰ、创建权限:

这时我们登陆用户2,现在如果要新建用户,那么只能建level大于3的用户,即店员。建立好用户后,要给这个用户分配权限,那么

店铺只能分配店铺2,菜单可以从当前用户有的1,2,3中选择任意组合的菜单。

同时,如果我们登陆用户1,我们既可以新建店长也可以新建店员,比如这时候没有1号店的店长,那我们新建一个店长,负责1号店,

同时给他操作1-3菜单的权限。

如上图,我们新建的两个用户。

Ⅱ、修改权限:

和创建的规则相同,如果我们登陆用户2,用户2可以修改用户3的权限,但是他不能修改用户3的店铺,只能修改用户3的菜单权限(rule),

比如从1,2,修改成2,3。

但是如果我们登陆用户1,他就可以修改用户2-4的权限,比如他可以修改用户3的store到1,菜单不变,那么此时用户3就是1号店的店员了。

三、权限验证

权限创建好了,接下来就是如何验证权限了。

Ⅰ、结果显示:

所谓结果显示,就是当前用户只能看到当前用户有权限的菜单。比如,上表中的3号用户,他只能看到菜单1和2,同时,菜单1是会员信息,那么

他只能看到2号店铺的会员信息。这个很简单,只需要数据库关联查询就可以了。但是在这里我建议,单独封装一个方法来获取用户的权限。

这样的好处就是修改的时候可以统一修改。比如我这里有个fuction,就是从数据库把rule取出来。但是如果需求改变了,不准任何用户操作1号菜

单。那么这时候你只需要在这个function里把结果中的1去掉就好了,而不需要每个地方都去改。

Ⅱ、权限验证:

结果显示只能说防君子不防小人,因为就算你隐藏了,也可以通过url来访问。比如你的url /store/store_id/1 表示访问1号店铺,这时候,就算你的在界面上

隐藏了2号店铺,但是我依旧可以通过  /store/store_id/2访问。所以权限控制需要在控制器里进行拦截。这时候一般是把权限验证放在基类的构造函数中。

phper要注意php不会主动执行父类构造函数的问题,然后其他的控制器继承这个基类(基础控制器)。

那么在用户访问一个方法的时候,首先验证这个用户是否有访问当前方法的权限,有则通过,没有则报错。例如上表中的用户3,他有访问菜单1和2的

权限,也就是Admin/Base/member和Admin/Base/order。那此时他访问Admin/Base/goods方法,就应该到报错界面。

同样,我们规定对店铺的访问key必须是store_id,那么就可以获取store_id的参数,如果是2,则用户3可以访问,反之如果是其他的,则报错。同样,

我们统一商品的必须用good_id表示,那么我们获取good_id的id,如果他属于店铺2,则用户3可以访问,反之拒绝。

以上,一个简单的B2B2C的权限系统就完成了,当然,权限系统一般都和具体的业务和需求结合得比较紧密,大家在实际设计时可以进行相应的限制或者

拓展。

php项目权限系统设计的更多相关文章

  1. 基于RBAC模型的权限系统设计(Github开源项目)

    RBAC(基于角色的访问控制):英文名称Rose base Access Controller.本博客介绍这种模型的权限系统设计.取消了用户和权限的直接关联,改为通过用户关联角色.角色关联权限的方法来 ...

  2. 权限系统设计实现MVC4 + WebAPI + EasyUI + Knouckout

    权限系统设计实现MVC4 + WebAPI + EasyUI + Knouckout (一) 一.前言 之前的博客一直都还没写到框架的实现及权限系统,今天开始写我的权限系统,我以前做过的项目基本上都有 ...

  3. 权限系统设计(0):权限系统设计基本概念改需-MAC/RBAC引子

    此篇主要对权限系统设计所涉的一些专业术语重点梳理.从我们windows的文件系统 自主访问控制 到基于角色访问控制. 权限设计基本术语 对后面会用到的词汇做一个简要说明 什么是权限(许可) 权限(Pr ...

  4. 我的权限系统设计实现MVC4 + WebAPI + EasyUI + Knockout(四)授权代码维护

    一.前言 权限系统设计中,授权代码是用来控制数据访问权限的.授权代码说白了只是一树型结构的数据,没有什么其它的业务意义.那么这个页面的功能也就非常简单授权代码维护:新增.修改.删除授权代码数据. 二. ...

  5. 我的权限系统设计实现MVC4 + WebAPI + EasyUI + Knockout(三)图形化机构树

    一.前言 组织机构是国内管理系统中很重要的一个概念,以前我们基本都是采用数据列表的形式展现,最多只是采用树形列表展现.虽然够用,但是如果能做成图形化当然是最好不过了.这里我不用任何图形控件,就用最原始 ...

  6. 我的权限系统设计实现MVC4 + WebAPI + EasyUI + Knockout(二)菜单导航

    一.前言 上篇博客中已经总体的说了一下权限系统的思路和表结构设计,那接下来我们就要进入正文了,先从菜单导航这个功能开始. 二.实现 这个页面基本不用什么需求分析了,大家都很明白,不过在这个页面要多维护 ...

  7. Jenkins配置基于角色的项目权限管理--转

    本文将介绍如何配置jenkins,使其可以支持基于角色的项目权限管理. 由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,本文将使用Role Str ...

  8. 基于Spring Cloud、JWT 的微服务权限系统设计

    基于Spring Cloud.JWT 的微服务权限系统设计 https://gitee.com/log4j/pig https://github.com/kioyong/spring-cloud-de ...

  9. Jenkins配置基于角色的项目权限管理

    转自: http://www.cnblogs.com/gao241/archive/2013/03/20/2971416.html, 版权归原作者. 本文将介绍如何配置jenkins,使其可以支持基于 ...

随机推荐

  1. js下载blob的形式

    前端构建blob的方式就是通过服务器返回的文件来创建blob,需要知道文件在服务器的具体路径,用bob创建object url对象,添加到a标签上,然后触发,blob有两个问题,1.对浏览器有兼容性限 ...

  2. vue-$watch属性方法

    特性 https://www.cnblogs.com/widgetbox/p/8954162.html https://segmentfault.com/a/1190000012948175?utm_ ...

  3. Angular 开发环境搭建

    Angular 是一款开源 JavaScript 框架,由Google 维护,用来协助单一页面应用程序运行的.它的目标是增强基于浏览器的应用,使开发和测试变得更加容易.目前最新的 Angular 版本 ...

  4. ubuntu - 14.10,解决按照最新版Gnome 15.10后,经典Gnome桌面字体问题!

    ubuntu14.10刚安装完毕,我首先按照了经典Gnome桌面,随后我发现ubuntu软件中心里面能找到的软件明显不如先前我安装过的ubuntu了,我觉得有可能是因为我以前安装的ubuntu14.1 ...

  5. jstl中c:foreach下的表格实现异步刷新

    setInterval(function(){ var url = "${ctx}/alarm/alarm/CompanySort";//填你自己的路径 var data = {} ...

  6. Vue-Cli项目如何查看依赖调用关系?

    Vue是个优秀的前端框架,不管是前端还是后端开发人员都能很快使用Vue来开发应用.但是随着项目开发的深入,组件之间的依赖就变得越来越多,耦合越来越严重.这时候我们迫切地需要分析下组件和依赖之间的调用关 ...

  7. 第五篇.python进阶

    目录 第五篇.python进阶 1. 异常处理 2. 数字类型内置方法 2.定义: 3.常用操作+内置方法: 4.存一个值or多个值: 5.有序or无序: 6.可变和不可变 1.用途: 2.定义: 3 ...

  8. BLE 5协议栈-属性协议层(ATT)

    文章转载自:http://www.sunyouqun.com/2017/04/page/2/ 属性协议(Attribute Protocol)简称ATT. ATT层定义了属性实体的概念,包括UUID. ...

  9. POJ1722 算法竞赛进阶指南 SUBSTRACT减操作

    原题连接 题目描述 给定一个整数数组\(a_1,a_2,-,a_n\). 定义数组第 i 位上的减操作:把\(a_i\)和\(a_{i+1}\)换成\(a_i - a_{i+1}\). 用con(a, ...

  10. python和ruby:一些需要注意的小区别。

    python和ruby的一些区别 基础区别 运算符号/和// ruby只有/符号.它根据操作的数字类型返回对应的结果.如果数字的类型是int,则返回整除结构,如果是float,则返回float类型的计 ...