RBAC 权限控制设计

来源:互联网 发布:服务器网络架构 编辑:程序博客网 时间:2024/05/18 01:19

RBAC 权限设计

  • 上个月,因项目的扩展,目前的后台管理系统达不到当前需求和后期需求,要在原来基础上去扩展更多内容,而且是天翻地覆的改,权限控制也要加上去。很为难我这个后端人员,更何况后端人员就我一个人,又搞前端又搞后端的,还想不想过年了,刚好公司招到了一个前端小妹,然后我就在想,如果让她在我基础上面去做,还需要时间,毕竟她之前都是做完页面然后就扔给后端人员去对接数据,而且就算我教她如何在mvc模式里面的v做对接,但是因为后端就我一个人,一边要写app的api接口,一边还需要写后台管理的扩展,这样的话,她需要等我才能对接等等,总之很多多问题,效率没有那么快,虽然她也懂后台前端框架,但是我需要更大的帮助,所以这样看来,我的工作量还是没有减少多少,而且,整体效率也不快。因此我就在想,我要不要搞个前后端分离,这样后期再怎么扩展,会省很多事,然后我决定了,开搞。首先我要重新设计后端整个基本构架,也就是权限构架,我之前没有搞过,然后我需要在网上百度很多相关的权限设置,各说风云,然后综合前辈们的思维,设计属于适合我目前项目需求的一个权限设计。

  • 废话不多说,先上图:
    这里写图片描述

  • 从上面的图片,可以看到,最基本的也是最关键的,也是必需的有三个表:

    • 第一个是管理员表admin,里面的字段是:id,账号,密码,添加时间,最后登录时间,备注,状态。

    • 第二个表是角色表role,里面的字段是:id,角色名称,状态,备注

    • 第三个表是权限表permission,里面的字段是:id,权限名称,控制器,方法名,类型,状态,备注,添加时间。我再来分析一下我之所以添加控制器字段和方法名字段以及类型,是因为项目使用的框架问题,这个框架的访问地址是:http://域名/控制器/方法名,我需要控制访问的url权限,所以添加的。只要type类型,是因为我要区分是点击权限还是访问菜单权限。以上这三个表,是最基本也是最重要的,完全能控制权限了。(关系表放后面说)

    • 因项目需求,我需要控制菜单的显示,不同人登录,显示不同的菜单,所以我有添加了第四个表,菜单表,menu,因为我的菜单只有最多二级菜单,所以设计是:id,名称,地址,pid,排序,状态。

  • 总结一下整体思路,管理员可以是多个角色,每个角色也可以多个权限。管理员对应的角色,角色对应权限,所以管理员就拥有了对应的权限,看你自己怎么对应了,如果角色没有那么细,你可以只对应一个角色,然后角色对应的是多个权限,看自己管理添加了。

  • 因此你应该还感觉缺少了什么,对,没错,就是链接表,也就是关系表,

    • 管理员表跟角色表的关系表
    • 角色表跟权限表
    • 因为我项目需求,需要菜单表,所以有了权限表和菜单关系表。
  • 说明一下关系表,一定要用外键,保持数据的一致性哦,我用的是mysql, 所以上面用到的表的储存引擎都是Innodb,然后用到外键,详细看思维导图了。

  • 到这里,基本就结束了。然后最后,整体说一下具体是怎么来,控制:

    当管理员登录了之后,生成的token,生成token之前,你需要查到他到底有哪些权限的控制器和方法名,还要查询有哪些能访问的菜单id,然后一并保存到token里面,当传递过来的token(token生成和登录流程我就不重复讲述了http://blog.csdn.net/abc369666/article/details/78733592,(如果你不是前后端分离的,你平时用的应该是session的话,你就用session来保存),然后登录成功之后,你就可以知道他拥有了哪些权限和哪些显示的菜单,然后对应的菜单显示,然后要再做判断,当他请求了http://域名/控制器/方法名,你就取出控制器和方法名,在入口文件去判断,把取到的控制器方法名去对比你现在拥有的权限是否在内,拥有说明可以正常访问,没有拥有该权限就提示没有该权限了,你也可以控制整个控制器都是开放的接口,这样你所有需要开放的都可以不做权限控制,如下图:
    这里写图片描述

温馨提醒:仅供参考,请根据自己项目需求,来设计不同的权限控制,不要盲目跟从哦!