复习笔记8 位映射实现的权限管理
2012-05-20 14:52
148 查看
public class Test9 { public static void main(String[] args) { User user = new User(); //这里我们给了用户两个权限,一个注册,一个登陆 //01 | 10 结果是 11,这没什么好说的了,都讲过了 user.setPermission(Permission.BBS_PERMISSION_REGISTER | Permission.BBS_PERMISSION_LOGIN); System.out.println(getIntegerToBinary(user.getPermission())); //这里修改了用户的权限,变成了登陆和退出 user.setPermission(Permission.BBS_PERMISSION_LOGIN | Permission.BBS_PERMISSION_LOGOUT); System.out.println(getIntegerToBinary(user.getPermission())); //而这,我们给用户增加了一个包括登陆和评论的功能, //说是回复也行,都一样,但要注意,登陆前边咱已经 //有了吧?这地方就是为什么用 | ,当然你用 & ^ //也能行,不过你是不是得求一下补集或者差集呢? user.addPermission(Permission.BBS_PERMISSION_LOGIN | Permission.BBS_PERMISSION_COMMENT); System.out.println(getIntegerToBinary(user.getPermission())); //删除这里比较有意思,其实就是求两个集合的并集 //并从用户权限集合中把这个并集干掉,就哦拉。 user.deletePermission(Permission.BBS_PERMISSION_LOGIN | Permission.BBS_PERMISSION_ACCESS); System.out.println(getIntegerToBinary(user.getPermission())); System.out.println("======================================>"); //这里边列出了查询中会碰到的一些情况, //也是用来测试这个功能是不是好用 System.out.println(user.contains(Permission.BBS_PERMISSION_COMMENT)); System.out.println(user.contains(Permission.BBS_PERMISSION_LOGOUT)); System.out.println(user.contains(Permission.BBS_PERMISSION_COMMENT | Permission.BBS_PERMISSION_LOGOUT)); System.out.println(user.contains(Permission.BBS_PERMISSION_ACCESS)); System.out.println(user.contains(Permission.BBS_PERMISSION_LOGOUT | Permission.BBS_PERMISSION_ACCESS)); System.out.println("======================================>"); //这个逐级审查其实有个小窍门,只要在找到这个掩码表示的权限之前 //发现1个0,那肯定就是假,至于这个应用在什么地方,方法的注释上有 user.setPermission(Permission.BBS_PERMISSION_REGISTER | Permission.BBS_PERMISSION_LOGIN | Permission.BBS_PERMISSION_COMMENT); System.out.println(getIntegerToBinary(user.getPermission())); System.out.println(user.containsBits(Permission.BBS_PERMISSION_COMMENT)); System.out.println(user.containsBits(Permission.BBS_PERMISSION_LOGIN)); System.out.println("======================================>"); user.setPermission(Permission.BBS_PERMISSION_REGISTER | Permission.BBS_PERMISSION_LOGIN | Permission.BBS_PERMISSION_COMMENT | Permission.BBS_PERMISSION_PUBLISH); System.out.println(getIntegerToBinary(user.getPermission())); System.out.println(user.containsBits(Permission.BBS_PERMISSION_COMMENT)); System.out.println(user.containsBits(Permission.BBS_PERMISSION_LOGIN)); System.out.println("======================================>"); } public static final String DEFAULT_INT_ZERO = "00000000000000000000000000000000"; public static final String getIntegerToBinary(int value) { String binary = Integer.toBinaryString(value); int length = Integer.SIZE - binary.length(); return DEFAULT_INT_ZERO.substring(0, length) + binary; } } class User { private int permission = 0; public void setPermission(int permission) { this.permission = permission; } public int getPermission() { return this.permission; } /** * 检查用户是否具有指定的权限集合 * @param masks * @return */ public boolean contains(int masks) { // return (this.permission | masks) == this.permission; return (this.permission & masks) == masks; } /** * 逐级审查 * 这个用在这里其实并不恰当,举个例子说下 * 比如说在10层楼里,很多重要地方都是有权限的吧 * 比如职员只能在1楼,经理可以去2楼,老总在顶楼之类的 * 那么也就是说我有2楼的权限是不是也能去1楼,老总的10层权限 * 哪层都可以吧? * * 另外一个是,这个函数的方法是不是最优的,其实还有简便写法 * 你可以自己尝试下。我现在这个写法仅是用来符合逻辑 * * 从1楼到10检查,比如看你有没有3层的权限,是不是意味着,如果 * 你没有1楼的就直接不可能有3楼的权限,因为你连这个楼的大门都进不来吧? * 换句话说你想到几楼去,这个楼层之前任何的一层楼你没有权限你都不能到这个楼去 * * 虽然这个方法的局限性很大,但应用范围也很广 * @param mask * @return */ public boolean containsBits(int mask) { //这个0其实会略微影响效率,正常开发不会写这个 //因为0基本上不会有人传进来,这个看似是提高 //效率的办法其实是错的。 if(mask == 0) return false; int tmp = 1; while (true) { if((tmp & this.permission) == tmp) //这个if千万不能合并到上边,否则必错 //因为这里的else的作用域也被提升了 if(tmp == mask) return true; else { //这里的两行不能写进下边的else里 tmp <<= 1; continue; } else return false; } } /** * 为用户添加权限 * @param masks 需要添加的权限集合 */ public void addPermission(int masks) { //这里为什么不用检测是否有某些权限? this.permission |= masks; } /** * 为用户取消权限 * @param masks 需要取消的权限集合 */ public void deletePermission(int masks) { //这里主要分析的是,用户和你要删除的权限的交集 //用户没有的没必要进行操作 this.permission ^= (this.permission & masks); } } //这里的接口是用来封装掩码集的,其实这在java里很常见 //接口并不意味着必须要有功能抽象 interface Permission { public static final int BBS_PERMISSION_REGISTER = 1; public static final int BBS_PERMISSION_LOGIN = 2; public static final int BBS_PERMISSION_PUBLISH = 4; public static final int BBS_PERMISSION_COMMENT = 8; public static final int BBS_PERMISSION_ACCESS = 16; public static final int BBS_PERMISSION_LOGOUT = 32; }
相关文章推荐
- laravel学习笔记------使用 Entrust 扩展包在 Laravel 5 中实现 RBAC 权限管理
- [RedHat笔记]第二课:时间表示、帮助命令、文本查看命令、实现用户管理及权限、BASH、变量、脚本
- 实现业务系统中的用户权限管理--设计篇
- 实验楼 Linux 基础入门 用户及文件权限管理 作业笔记
- java web实现用户权限管理
- jQueryUI+jqGrid实现后台管理系统,包括权限管理,用户管理,任务管理
- java 管理权限学习笔记
- Spring security实现权限管理
- 通用权限管理系统组件 (GPM - General Permissions Manager) 中实现按部门组织机构设置权限
- MVC 自定义AuthorizeAttribute实现权限管理
- 使用URL参数+Controls层实现网站用户权限管理
- Spring项目集成ShiroFilter简单实现权限管理
- 基于角色的访问控制'的权限管理的数据库的设计实现
- 【Spring Security】三、自定义数据库实现对用户信息和权限信息的管理
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)
- 关于用Java程序实现8421码权限管理 -第三部分
- SQL Server:OA权限管理设计的实现 下
- 回答客户对通用权限的疑问,页面里如何判断权限?如何实现上级能管理下级?基础表用哪个?
- zTree树实现用户权限管理
- 自定义注解实现权限管理框架或其它功能扩充