最近看到了一个项目的权限是根据bigineger来进行计算的菜单权限,觉得还是不错,存储上只需要存储在一个字段里就可以了,通过计算算出该角色的菜单权限即可,效率也非常的快,放在session中也非常的小,下面简单说一下思路。

        首先,将界面中选好的菜单树,勾选完成后传到后台,后台通过转成字符串数组来进行设值

       

[java]  view plain  copy
  1. public static BigInteger sumRights(String[] rights){  
  2.         BigInteger num = new BigInteger("0");  
  3.         for(int i=0; i<rights.length; i++){  
  4.             num = num.setBit(Integer.parseInt(rights[i]));  
  5.         }  
  6.         return num;  
  7.     }  
通过上面方法,返回一个BigInteger,然后将这个数字存入所属角色的菜单权限字段中。注意的是:这里的菜单ID必须是数字, String[] rights为所选菜单的数组,通过setbit方法一一设置进num中。


其奖,再获取权限的时候,也一样,通过把之前存入的菜单权限的biginteger和菜单ID做对比来判断是否具有该菜单权限

[java]  view plain  copy
  1. public static boolean testRights(BigInteger sum,int targetRights){  
  2.         return sum.testBit(targetRights);  
  3.     }  

sum为对应角色的菜单权限值, targetRights为具体菜单ID,通过biginteger的testBit方法来判断是否存在里面,如果存在就返回true,不存在就返回false.

biginteger通过set的值,其实是2的权的和。下面有一个列子:

[java]  view plain  copy
  1. package com.hundsun.network.post.settle.job;  
  2.   
  3. import java.math.BigInteger;  
  4.   
  5. public class TestBigInteger {  
  6.   
  7.     public static void main(String[] args) {  
  8.         //初始  
  9.         BigInteger num = new BigInteger("0");  
  10.         num = num.setBit(2);  
  11.         num = num.setBit(1);  
  12.         System.out.println(num);  
  13.         System.out.println(num.testBit(2));  
  14.         System.out.println(num.testBit(1));  
  15.         System.out.println(num.testBit(3));  
  16.     }  
  17.   
  18. }  
num的值为6,是这样计算的2^2+1^2=6。

通过这种方式,不管是解析和查询其实效率都是很高的,占用session的空间也非常的小,不为是一个好的权限设计思路。

原文地址:https://blog.csdn.net/qq_39654446/article/details/78197688

发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

可能是史上最全的权限系统设计知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。