刚才在研究系统的权限算法,看了很多文章和帖子,每当看到一个新算法,就拍案称绝,却全然没有了往日的理性判断,直到看到该算法后面的评论才能发现其中的缺陷。猛然发觉,这不就是岁数大了,头脑不够使的典型症状么?!
人不思不明,看来头脑这东西还是要经常使,总被破烂事塞满脑子,最终也就变成了破烂。
收藏小型权限算法一则:此算法只适用于小型系统的权限设置,而且使用整型数字作为权限阈值,所以数据字典务必要做好,否则后患无穷~
假设有权限定义——
删除A---0
修改A---1
添加A---2
删除B---3
修改B---4
添加B---5
理论上可以有N个操作,这取决于你用于储存用户权限值的数据类型了。这样,如果用户有权限:添加A---2;删除B---3;修改B---4。那用户的权限值 purview =2^2+2^3+2^4=28,也就是2的权的和了。化成二进制可以表示为11100。这样,如果要验证用户是否有删除B的权限,就可以通过位与运算来实现。在Java里,位与运算运算符号为&,即是:
int value = purview &((int)Math.pow(2,3));
即,当用户有操作权限时,运算出来的结果都会等于这个操作需要的权限值。
因此,可设计如下方法作为权限判断(单权限系统),多权限系统在此基础上扩展即可:
//userPurview是用户具有的总权限 //optPurview是一个操作要求的权限为一个整数(没有经过权的!) public static boolean checkPower(int userPurview, int optPurview){ int purviewValue = (int)Math.pow(2, optPurview); return (userPurview & purviewValue) == purviewValue; }
此方法虽然简洁而精妙,却由于整数位数限制,而只能表示有限种权限,因此只适用于小型简单系统的权限控制。
原算法及其探讨见http://www.iteye.com/topic/714076