本帖最后由 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。
level.zip
(2.29 KB, 下载次数: 2414)
测试类.7z
(825 Bytes, 下载次数: 1157)
使用该功能的项目应经开源,详见http://qloa.sf.net
|