自制CI多权限控制类,轻松搞定多权限管理
本帖最后由 yunnysunny 于 2012-2-13 11:17 编辑在处理OA系统时,我们不可避免的面临着众多的角色,而且令人头疼的是,我们还会面临一人身兼多职的情况,也就是说一个人拥有多个权限,所以一套完备的权限控制系统成为一个OA系统健壮性的首要条件。那么怎样方便的给某个角色赋予多个权限,怎样判断某个角色是否含有某特定权限,又怎样来删除掉多个权限中的某个一个权限呢,等等问题需要解决。为了说明这些问题的解决思路,我们假设系统中一共拥有15个角色,分别为:普通用户、营员、外语选手、通讯录、软件选手、校方负责人、评审专家、指导老师、准命题老师、命题老师、就业服务人员、编辑、命题评审组长、大赛负责人、管理员、培训老师。我们用15位二进制来表现他们的权限值。权限的对应关系如下表:
位数拥有权限转化后的十进制数
14培训老师16384
13管理员8192
12大赛负责人4096
11命题评审组长2048
10编辑1024
9就业服务人员512
8命题老师256
7准命题老师128
6指导老师64
5评审专家32
4校方负责人16
3软件选手8
2外语选手4
1营员2
0普通用户1
-1或其他非法用户--
我们在处理时,用户的权限是一串15位二进制数字,每位代表一个权限,比如说一个用户同时具有外语选手、营员和普通用户的权限,那么他的二进制权限字符串就是:000000000000111(0,1,2位权限)同样,如果一个用户同时具有大赛管理员和编辑的权限,那么他们的权限字符串就是:001010000000000(10,12位权限)我们在数据库中存储的是二进制转化后生成的十进制,这样我们前面所说的第一个用户的权限值就是7(外语选手、营员和普通用户:4+2+1),第二个用户的权限值就是5120(大赛负责人、编辑:4096+1024)。利用这个转化规则,一个用户可以有多个权限,当我们判断一个用户是否具有某个权限时,只要把他的权限值和特征权限值相与就可以了。比如说,我们还拿刚才举的第二个用户做例子,他的权限是5120,我们判断他是否是大赛负责人,只需将5120和4096相与,结果返回为真,说明它具有大赛负责人权限;如果要判断他是否是管理员,只需将5120和8192相与,结果为假,说明他不是管理员。
添加和删除权限也很简单,只需把对应权限为置1或者置零,例如添加2号位权限,只需将原权限或上0000000000000100,删除2号位权限只需将原权限与上111111111111011。
使用该功能的项目应经开源,详见http://qloa.sf.net
magicone 发表于 2014-7-13 12:17
权限放session array里速度也不慢啊~~~ 为啥非要这么做
session里面的东西肯定放的越少越节省资源,你的设计要放一个数组,但我这里就放一个数字。
回复 15# tacyuuhon
在构造函数中读取了一个config.php中的值level_nums,它的意思就是系统中角色的个数,如果是15中角色,就要配置config['level_nums']=15,这个会影响生成的二进制字符串的长度。假设在config.php中设置的level_nums为15,但是你要设置一个权限值为16的权限,将会产生一个类似“溢出”的结果,它将得到一个00000000000000,即产生的结果为0。 不错,值得大家学习 太需要这样的东西了!呵呵 不错不错,下回来研究研究 楼主,有个问题想请教一下:
函数 GetLevel 的返回值,你是这样子写的:
if($j==1) return $returnArray;
return ($j>0)? $returnArray : -1;
返回值有可能是单个字符,也有可能是个数组,为什么不统一返回数组呢?请问您这样写的目的是? 想法不错 我原来用array的形式来做的 效率比这个低多了。 回复 4# lcnphp
当初团队中人提的建议,现在想想,写的不是很合适,你可以修改成自己想要的。 学习一下,一直想php oa权限流方面的东西。 添加:
位数 拥有权限
16 SuperHero
删除:
位数 拥有权限
7 准命题老师
认证系统废啦。 扩展性不好。 回复 9# tacyuuhon
不明白你的意思。好像是你没有用对代码。