YCOE

You Can't stOp mE!

权限控制算法

Posted on 2006-03-20 00:17 YCOE 阅读(1629) 评论(6)  编辑 收藏 所属分类: 数据结构与算法

这里我介绍一种很常用,也比较Professor的权限控制思路。
这里我用java语言描述,其实都差不多的。自己转一下就可以了。
为了方便,我们这里定义a^b为:a的b次方
这里,我们为每一个操作设定一个唯一的整数值,比如:

删除A---0
修改A---1
添加A---2

删除B---3
修改B---4
添加B---5
。。。

理论上可以有N个操作,这取决于你用于储存用户权限值的数据类型了。

这样,如果用户有权限:添加A---2;删除B---3;修改B---4
那用户的权限值 purview =2^2+2^3+2^4=28,也就是2的权的和了(之前打错了)。
化成二进制可以表示为11100
这样,如果要验证用户是否有删除B的权限,就可以通过位与运算来实现。
在Java里,位与运算运算符号为&
即是:int value = purview &((int)Math.pow(2,3));
你会发现,当用户有操作权限时,运算出来的结果都会等于这个操作需要的权限值!

原理
位与运算,顾名思义就是对位进行与运算:
以上面的式子为例:purview & 2^3 也就是 28&8
将它们化成二进制有
 11100
& 01000
-------------------
  01000 == 8(十进制) == 2^3
同理,如果要验证是否有删除A---0的权限
可以用:purview &((int)Math.pow(2,0));
即:
 11100
& 00001
------------------------
  00000 == 0(十进制)  != 2^0

这种算法的一个优点是速度快。可以同时处理N个权限
如果想验证是否同时有删除A---0和删除B---3的权限
可以用purview&(2^0+2^3)==(2^0+2^3)?true:false;
设置多角色用户。根据权限值判断用户的角色。。。

下面提供一个java的单操作权限判断的代码:

//userPurview是用户具有的总权限
//optPurview是一个操作要求的权限为一个整数(没有经过权的!)
public static boolean checkPower(int userPurview, int optPurview){
  
int purviewValue = (int)Math.pow(2, optPurview);
  
return (userPurview & purviewValue) == purviewValue;
}
当然,多权限的验证只要扩展一下就可以了。
几点注意事项:首先,一个系统可能有很多的操作,因此,请建立数据字典,以便查阅,修改时使用。其次,如果用数据库储存用户权限,请注意数值的有效范围。操作权限值请用唯一的整数!

补充:如果用Java的int类型的话,是32位,最多只能保存31个权限的运算,而对64位的,估计也只能保存63个权限,因此,对于更多的权限,应该进行分组,而且,过多的权限放在一起,也不易管理。
对于2的N次方来说,从硬件最底层来说,只是N次左移而已,因此并不会占用太多的资源。当然,对于一些极端情况,可能并不是一种很好的解决方案,但对于一般的中小型系统,已经足够应付!此处只是对一种算法的介绍,并不带任何的排它性!!!

               --原创,发表于:http://www.blueidea.com/tech/program/2006/3153.asp

Feedback

#1楼    回复  引用    

2006-06-15 16:12 by fjsl [未注册用户]
不客气的说一下,对大一点的系统来说根本行不通,有几十,上百个操作的化就不行了,2的100次,晕

#2楼 [楼主]   回复  引用  查看    

2006-10-16 01:49 by YCOE      
  最近发现,这篇文章已经被很多地方引用。很高兴,看了下,虽然有褒有贬,却觉得很伤心。为此想在这里更正网友的一些本人觉得不当的见解。
  首先,再次声明此算法不是本人原创,这里只作个介绍而已!
  再次,当今权限验证有很多种实现方法,此算法不一定是最好,但我敢说绝对不算差!权限验证进入实际的项目时会有不同的变化,而很多的网友说此算法不适合成千上万权限要验证的情形,更有甚者说我没有学过编程,为此特伤心。不能否认,此算法单个最多只能支持63个权限(如果用long类型的话),但是一个最底层的类根本达不到63个权限,如果有的话只能说你的类设计得不好(我可以很肯定地说)!Java编程规范中有一个规范:除了工具自动生成的代码外,源代码文件的长度原则上不能超过500行!(不要和我说什么死规矩之类的话,你想改变这个规范自己先搞点名堂出来,不然还是学乖一点!!!)
  
网友评论  
  2000年的时候估计可以用用
  现在都是标准的分级控制 角色 对象 权限
 

  算法不会这么快成为历史的!他自己说:角色 对象 权限。看来也是只会说,却没能理解。
  上面所说的“最底层的类”其实就是他所说的“对象”,是直接操作对象的对象。角色是指部分或全部这些对象的集合。就像一个金字塔一样,最底层是对象,最上层是角色,一个角色可以有很多对象的权限,一个对象又可以有很多权限,而类里又没有成员变量数量的限制,因此,在这种模式,实现成千上万种权限实际是很简单的事,而且有很不错的层次结构。
  如果你硬要把角色的权限都写在一起,那我建议你回去再学学继承和重载吧。
  写个容易点的例子,比如一个人,可以有很多种行为:打开电脑、关闭电脑、冲咖啡、喝咖啡、倒咖啡......当他对电脑进行操作时,他是一个电脑使用者;当他对咖啡进行操作时,他只是一个咖啡使用者,而不用管它是个经理还是个员工。对于电脑使用者,它只有一个对电脑使用的权限值,对只是一个电脑而言,操作不可能超过63个的,如果硬要把删除这个文件,删除那个文件作为一个操作的话,你还可以再往下细分,总之最底层类很少情况会超过63个权限的。
 
网友评论
 
0和1这两个值能创造今天的计算机!还不通过分离组合!你就不会分开建立多个32或64种权限!
 

  感谢这位网友,总算说中了。

#3楼    回复  引用    

2006-12-11 16:33 by jack_xu [未注册用户]
这个算法是比较常用的,就像以上所说只适合不超过63种权限的系统,现在的系统超过63种权限的大大的在,并不像你说的 “不可能操作63个”之类的话

#4楼    回复  引用    

2007-01-19 10:21 by 小朱 [未注册用户]
这个不是太好

#5楼    回复  引用    

2007-01-29 13:50 by 不说 [未注册用户]
63个角色 * 63 个 权限 = 3969个不同权限

#6楼    回复  引用  查看    

2008-04-26 08:48 by 留恋星空      
mark

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-12-26 13:54 编辑过