技术思绪摘录旅行笔记
由LINUX想到的权限设计方案,设计思维非常的巧妙,在项目中使用非常的好用,本文以案例权限设计给介绍一下用法。

    在最近的一个项目中需要用设计权限系统。在网上查了一下,大部分设计方案都是采用菜单、按钮、用户或角色。这种方案中一个系统可以有多个菜单项(或者菜单打开后的页面),每个菜单项中是可以有多个功能按钮(可以理解为页面上的按钮)。同时一个系统是可以有多个用户的。

这种设计方案实际数据存储量是比较大的。借用一位网友的话来说就是:“假设一个系统有100个菜单、每个菜单平均4个功能按钮、每个系统有5000个用户。 那么这个权限表记录数可能达到5000*4*100=2000000条。在每次登录时都要查几百万的数据,登录速度可想而知。”看网友的话再仔细一想,似乎是这么回事。如何设计才能降低数据的存储量呢?
在LINUX系统中,文件的权限是设计的非常巧妙地。用过LINUX系统的人都知道在LINUX中权限是可以用数字代替。比如读取的权限数字码就是“4”,写入的权限数字码是“2”,以及执行的“1”。要想组合一个权限就可以用数字码的相加来完成组合,比如数字“6”就是代表可读取可写入(4+2)。这种设计确实是非常巧妙地,用一个数字就可以表示多个意义。
在我们的这个系统中,正好可以采用这个巧妙的设计来解决上面说的数据量大的问题。下面具体说一下这个巧妙地设计如何实现。


psb.png

1.1 解码示例




在上图中我们定义一菜单和一系列的权限,也就是图中左边的树结构。每个操作权限都有一个对应的数字码。仔细看数字码我们可以发现其实就是2的0~4 次方,为什么数字码要这样设计?我们看下图:

psb (1).png


1.2 权限组合


前面我们说过LINUX中权限是通过数字相加得到的,同样我们将1、2、4、8、16这几个数字做相加。左边两列中是所有可能出现的相加情况,将其整理后放在右边两列中。仔细看就会发现所有相加的结果值完全没有出现重复,这就是为什么数字码要采用2的0~N次方的原因。我们采用这种组合方式来储存权限将极大的减少数据量,将由原来的“菜单数×按钮数×用户数”直接减少到了“菜单数×1×用户数”。
那么如何依据数字取得对应的权限呢?下面来说具体的结局思路。权限数字是有数字码相加而来的,取得权限就是要判断到底是那些数字码组合而成的。实现取得数字码的核心流程就是权限数字减去小于它的但是是最大的数字码。比如权限数字19是大于所有数字码的,但最大的数字码是16 ,于是就19减去16。因为19本身就是数字码合成的,所以相减过后要么直接就是数字码要么还是一个合成的权限码。当循环的减去小于它但是是最大的数字码,最后就得到合成权限码的所有数字码。

psb (2).png


1.3 解码


如图1.3中那样,输入权限码26解码后得到就是16、8、2 这三个数字码。参考左侧的权限树我们就是可以确定26这个权限码到底有哪些权限了。下面是具体的解码方法:

psb (3).png


CarsonIT 微信扫码关注公众号 策略、创意、技术

留下您的脚步

 

最近评论

查看更多>>

站点统计

总文章数:275 总分类数:18 总评论数:88 总浏览数:124.93万

精选推荐

阅读排行

友情打赏

请打开您的微信,扫一扫