公司项目运用的ACE开源框架,其中的菜单权限管理用到了BigInterger的setBit方法和TsetBit方法进行权限验证,感觉用这种方式来进行权限验证比较有趣,只需一个整型数便可以对多个菜单权限进行验证(权限ID必须要是正整数!!!!!),在这里用通俗易懂的方式分析一下,不设计位运算!哈哈。
假设我的数据库总共有4个菜单 | 4个账户
menu_id 菜单名称 user_id 菜单权限值 转换为二进制
1 菜单1 A 6 1 1 0
2 菜单2 B 12 1 1 0 0
3 菜单3 C 26 1 1 0 1 0
4 菜单4 D 30 1 1 1 1 0
假如用户A 有菜单1 菜单2 的权限, 权限值=2^1+2^2=6
用户B 有菜单2 菜单3 的权限, 权限值=2^2+2^3=12
用户C 有菜单1 菜单3 菜单4 的权限, 权限值=2^1+2^3+2^4=26
用户D 有菜单1 菜单2 菜单3 菜单4 的权限, 权限值=2^1+2^2+2^3+2^4=30
大家可以观察一下这些权限值转换为二进制数后的规律(假如把这些二进制数从右往左转换成一个bolean数组,0 代表 false 1 代表true),看上图的转换后的二进制,我们来看这个数组
0 1 2 3 4
用户A F T T F F
用户B F F T T F
用户C F T F T T
用户D F T T T T
把上面的 1 2 3 4 看成是菜单ID,T 和 F看成表示是否有该菜单权限,你们应该能发现其中的奥妙!(现在应该也可以说明为什么菜单ID必须为正整数了。。)