使用BigInteger.setBit与BigInteger.testBit来实现权限控制
2017-07-27 11:15
176 查看
公司项目运用的ACE开源框架,其中的菜单权限管理用到了BigInterger的setBit方法和TsetBit方法进行权限验证,感觉用这种方式来进行权限验证比较有趣,只需一个整型术便可以对多个菜单权限进行验证(权限ID必须要是正整数!!!!!),在这里用通俗易懂的方式分析一下,不设计位运算!哈哈。
假设我的数据库总共有4个菜单 4个账户
id 菜单名称 id 菜单权限值
转换为二进制
1 菜单1 1 6
1 1 0
2 菜单2 2 12 1 1 0 0
3 菜单3 3 26 1 1 0 1 0
4 菜单4 4 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数组,1 代表 false 2 代表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必须为正整数了。。)
假设我的数据库总共有4个菜单 4个账户
id 菜单名称 id 菜单权限值
转换为二进制
1 菜单1 1 6
1 1 0
2 菜单2 2 12 1 1 0 0
3 菜单3 3 26 1 1 0 1 0
4 菜单4 4 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数组,1 代表 false 2 代表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必须为正整数了。。)
相关文章推荐
- 使用BigInteger.setBit与BigInteger.testBit来实现权限控制
- BigInteger.setBit和BigInteger.testBit实现权限控制
- java权限控制BigInteger.setBit()详解
- 一款二级菜单和使用自定义标签实现简单权限控制
- struts2 使用注解、反射、拦截器实现基于方法的权限控制
- 使用spring aop实现URL地址参数权限控制
- BigInteger引申的一个访问权限控制解决方案
- 在struts2.1中使用注解和拦截器实现权限细粒度控制
- 使用ember-simple-auth实现Ember.js应用的权限控制
- 一款二级菜单和使用自定义标签实现简单权限控制
- Asp.net下使用HttpModule模拟Filter,实现权限控制
- 使用Spring Security、Spring Data Jpa实现的RBAC权限控制
- 使用service实现登录、权限控制
- cakephp学习:大部分动作使用Auth组件来控制权限,但少部分不用,如何实现?
- 使用BigInteger做权限判断
- Spring MVC使用拦截器实现权限控制
- Asp.net下使用HttpModule模拟Filter,实现权限控制
- 使用ACEGI实现权限控制,第一部分
- 使用Gitolite来对Git的repository实现权限控制
- 使用Gitolite来对Git的repository实现权限控制