文档章节

权限设计总结

sluggarddd
 sluggarddd
发布于 2016/03/28 22:51
字数 1096
阅读 1113
收藏 8

    业务系统除了具体的业务之外,最麻烦的就是对于每个成员权限的控制了。最近收拾东西,忽然飘出一张几个月前,进行权限表设计的思路,我觉得还是比较普适的,所以来总结一下。

    权限的控制要么是ACL要么是RBAC,他们具体的介绍看这里

    那么我的设计是RBAC的,既基于角色的访问控制,直接上例子吧。

    为了避免没人看,我把特点或者说优点放在前面吧:

    1)可以针对不同的实体创建不同的权限限制(实体是指如订单、商品等业务实体)。

    2)针对某实体的权力可拓展,针对某实体的权力等级大小也可拓展。

    3)支持多角色用户。

    4)角色可控制不同的实体。

    5)换言之,用户对所有实体都有不同的权限控制。


    以下表字段一切从简,维护性字段就不写了。

    1、首先我们得有个用户表,上面随便弄一些基本属性,以username为主键

    

    2、其次角色表得有吧,来一发角色表。

    

    3、那么考虑到多角色的情况,角色就不能作为一个字段在user表中,角色和用户的关系表得有吧

    

    4、下面就是跟别的权限设计不太一样的地方了,我实现将可能的操作尽可能穷举,那么就设计成酱紫了的一个表。   

    

    简单的介绍一下,我弄了一个表称为实体表(entity),它与角色,权力形成一个关系表,称为角色实体权限表吧(简称REP表)。REP表中穷举了可能有的权力,上面即为新增,读取,更新,删除,分派。我将这些权力分级,例如:

    

权力等级 含义
0 没有权限
10 自己可操作
30 同一个组织可操作
50 所有可操作

    如果我录入了一条权限数据为,假设role_id为1是普通员工权限,entity_id为1为订单实体

id role_id entity_id can_add can_read can_update can_del can_assign
1 1 1 0 50 30 10 0

    那么这条数据就可以解释成,普通员工权限他对于订单这个实体,没有权限增加订单,可以读取所有订单,可以对跟这个员工同一组织下维护的订单进行更新,可以删除自己创建的订单,并且这个订单他没有权限分派给别人。

    针对如果一个用户有多个角色,那么我们取所有角色对应操作的最大权力作为一个标准,在缓存中维护着这个权限数据,就可以进行权限管控了。

    这里我的权力值使用的是0、10、30、50,这其中其实留了后门,如果我想插入一个权力值位于自己和同一组织之间,例如这个组织下又新建了多个小组,那么我可以使用15作为权力值,这么做是留着用于权力的扩展。

    5、但是,总有操作事先没有考虑到的情况或者一些特殊情况,例如小张在不拥有管理员权限的情况下,拥有管理员的某项权力,我们不可能为了一个人去开一个角色吧,没关系,用一个特殊权限表记录即可。

    

    alias就是上面的can_read,can_update这些字段,level就是10、30、50这些权力值,entity_id则为实体id,现在估计看明白了,RPE表和这个表的合集不就可以满足上面的需求嘛。

    当然,如果你想要这个特殊权限也是需要配置的,那你为privilege建张表维护即可。

    

    6、看起来整体是这样的

    


    就我暂时使用的情况来说,除了配置起来比较繁琐,暂时还没有不能满足的地方,主要是他可以精确到比较细的粒度,即方便拓展又容易理解,我觉得还不错,个人感觉挺通用的,适合大部分场景,所以拿上来跟大家分享。


    完。

© 著作权归作者所有

共有 人打赏支持
sluggarddd
粉丝 7
博文 14
码字总数 11821
作品 0
程序员
私信 提问
权限管理设计、分析、实现参考资料

AspNetForums中基于角色的权限控制 http://blog.joycode.com/dotey/archive/2005/02/24/44791.aspx asp.net页面如何控制页面依据不同用户权限有不可见、可见、编辑 三种操作权限 http://com...

springfe
2006/11/13
0
0
基于角色的权限控制

AspNetForums中基于角色的权限控制 http://blog.joycode.com/dotey/archive/2005/02/24/44791.aspx asp.net页面如何控制页面依据不同用户权限有不可见、可见、编辑 三种操作权限 http://com...

tinwai
2010/03/26
0
0
架构学习资料汇总

知名网站架构分析 探索Google App Engine背后的奥秘(1)–Google的核心技术 探索Google App Engine背后的奥秘(2)–Google的整体架构猜想 探索Google App Engine背后的奥秘(3)- Google App Eng...

peter8015
2016/04/22
186
0
.NET Core实战项目之CMS 第八章 设计篇-内容管理极简设计全过程

写在前面 上一篇文章中我带着大家进行了权限部分的极简设计,也仅仅是一个基本的权限设计。不过你完全可以基于这套权限系统设计你的更复杂的权限系统,当然更复杂的权限系统要根据你的业务来...

依乐祝
2018/12/05
0
0
一步步教你如何用疯狂.NET架构中的通用权限系统 -- 在页面中的调用讲解

以下讲解是按最复杂的情况,讲解权限的要用法,若页面上不需要判断那么多,那么复杂的权限,那也不用搞得这么复杂,简单才是硬道理。 第一步: 首先需要在你需要用的页面里,把权限变量定义好...

技术小阿哥
2017/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 升级中的一些常见问题

升级的时候遇到了问题了吗? 如果你想尝试重新进行升级的话,你需要首先重新恢复老的备份。不要尝试再次对 Confluence 进行升级或者在升级失败后重新启动老的 Confluence。 在升级过程中的一...

honeymoose
今天
2
0
C++随笔(四)Nuget打包

首先把自己编译好的包全部准备到一个文件夹 像这样 接下来新建一个文本文档,后缀名叫.nuspec 填写内容 <?xml version="1.0"?><package xmlns="http://schemas.microsoft.com/packaging/201......

Pulsar-V
今天
2
0
再谈使用开源软件搭建数据分析平台

三年前,我写了这篇博客使用开源软件快速搭建数据分析平台, 当时收到了许多的反馈,有50个点赞和300+的收藏。到现在我还能收到一些关于dataplay2的问题。在过去的三年,开源社区和新技术的发...

naughty
今天
12
0
Python3的日期和时间

python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一下这两个库的区别,这可以帮助我们在适当的情况下时候合适的库。 在Python文...

编程老陆
今天
2
0
分布式面试整理

并发和并行 并行是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有...

群星纪元
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部