码迷,mamicode.com
首页 > 编程语言 > 详细

java web权限管理

时间:2015-12-20 19:03:31      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

之前项目采用spring4+security3做的权限管理,采用通用的 用户-角色,角色-资源来管理权限。但是太依赖角色,同时是粗粒度的,决定采用二进制权限管理,自己构建 
   1 依然采用组织概念,但是同时保留用户 
   2 资源可以赋权给组织,也可以赋权给用户,权限区分读写 
   3 用户可以在多个组织 
   4 用户权限覆盖组织权限 
   下面列出2进制权限算法演示 
  
Java代码  技术分享
  1.    //资源采用url表示  
  2.    把所有拥有独立权限的资源(url)写入数据文件例如mysql  
  3.    1、权限值的设定  
  4.   用二进制来表示权限值应该是按位来设置,每个位占一个,表示一种权限,如:  
  5.   
  6.     00000001表示十进制1,  
  7.     00000010表示十进制2,  
  8.     00000100表示十进制4,  
  9.     00001000表示十进制8;  
  10.   
  11.   依次类推,才能清晰正确的标识,多种权限的赋予则使用“或运算”,此时各位比较混乱,如00000011表示十进制3,此时它意味着拥有两种权限。  
  12.   
  13. Long userrolevalue ;//用户的权限值,根据他属于的权限组,这个值会不同  
  14. Long oprolevalue   ;//一个操作的权限值,根据他属于的权限组,这个值会不同  
  15.   
  16. 2、权限的赋予(或运算)  
  17. userrolevalue = userrolevalue | oprolevalue  
  18. 假设一个用户u1,他的初始权限值为0(00000000)。如果要指定他有经理的权限,经理的权限值为4(00000100),在第三个二进制位为1。  
  19. 很显然,userrolevalue =  0 | 4 ,值为4,如果u1要同时具有文员、主管、经理的权限呢,  
  20. userrolevalue = 0 | 1   00000000 | 00000001  = 00000001  
  21. userrolevalue = 1 | 2   00000001 | 00000010  = 00000011  
  22. userrolevalue = 3 | 4   00000011 | 00000100  = 00000111  
  23. 这样,第1、2、3位都是1了,用 “或”的好处就是只改变指定位的值,如果用户已经有了该权限,直接简单的用加法来做会出错,而用"或"再赋予一次,也不会出错,如下:  
  24. userrolevalue = 7 | 4   00000111 | 00000100  = 00000111  
  25.   
  26. 3、权限的除去(求补、与运算)  
  27. userrolevalue = userrolevalue & (~oprolevalue)  
  28. 假设一个用户u1,他的初始权限值为7(00000111),说明他能做文员、主管、经理权限组所能作的所有操作。如果不想让他有主管权限组能作的操作呢,那么,就要把他的权限值变为00000101,而主管权限组的权限值是00000010,显然简单的用减法,肯定也是不行的,但是先对00000010作补运算,可以得到11111101,再同00000111作与运算,就得到了00000101,这样就只对第二位作了改变,不会影响到其它位,我们的目的也就达到了。  
  29.   
  30. 对于一个操作,哪些权限组能操作它,也可以用与运算来做,不让某些权限组有些操作的权限,也可以先求补,再作与运算来解决。  
  31.   
  32. 4、权限的验证(与运算)  
  33. (userrolevalue & oprolevalue) != 0表示拥有oprolevalue所表示权限  
  34.   
  35.  例如:现有一个用户User的权限为6(00000110),通过&(与)运算,使用公式 "(User的权限 & 权限值) != 0" 即可判断拥有某个权限值表示的权限----6 & 2 == 2 (00000110 & 00000010 == 00000010),表示User拥有主管权限;6 & 4 !=0 (00000110 & 00000100 == 00000100) ,表示User拥有经理权限;6 & 1 == 0(00000110 & 00000001 == 00000000),表示User无文员权限;    

java web权限管理

标签:

原文地址:http://www.cnblogs.com/dayuebings/p/5061422.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!