您的位置:首页 > 其它

权限控制管理设计方法(指数幂)

2013-04-07 23:13 267 查看
权限控制管理在办公系统和WEB应用起着重要的作用,实现权限的方法很多,下面方法用指数幂实现:

1.定义公共操作方法,可以在配置文件(.ini | .xml)或数据库中设置:

后台权限操作,如:添加、浏览、删除、修改 (默认映射到:1, 2, 4, 8, 16, ...)

前台权限操作(独立权限,也可以合并到后台):浏览、评论、回复、发布信息、上传(大小和类型可放到角色|用户组中定义)、下载

超级管理员角色默认拥有全部权限,无需设置

2.操作对象

[tb_admin_object]

id

thisSort:唯一标识符,一般为对象数据表名,如news, user, product,指定权限应用的对象

thisName::如新闻信息管理,用户管理,

3.角色

[tb_role]

id

thisName

isSuper (1,超级管理员, 内置组,不可删除修改)

4.角色-权限 (可扩展:userGroup_permission, user_permission)

[tb_role_permission]

id

roleId

thisSort

permSum (int) :权限值为其子集中的整数之和,分解 3=1+2, 5=1+4, 6=2+4,……

5.用户

[tb_user]

id

roleIds :可拥有多角色(roleId1, roleId2, roleId3,...)

username

password

...

6.应用

(1) 查询有管理product权限: 添加-1,删除-4 的所有用户 (通过角色)

permSum =1+4 =5

Select roleId From tb_role_permission where thisSort='product' And permSum=5 ,返回值AllowRoleId:同一对象product的permSum值唯一

由查询结果集 rs[roleId] 再查找用户

Select * From tb_user where ','+[roleIds]+',' like '%,'+变量AllowRoleId+',%'

(2) 判断用户Tom拥有哪些权限 (通过角色)

获取 RoleIds

Select roleIds From tb_user Where username = 'Tom', 返回值:RoleIds

获取permSum

select thisSort, permSum From tb_role_permission where ','+变量RoleIds+',' like '%,'+roleId+',%' Order by thisSort

打印输出:

echo [角色:tb_role_permission.thisSort-用户管理] 的操作权限:

用actArr[] 表示 [添加、浏览、删除、修改、...数组]

for(i=0; i<actArr.length; i++)

{

//权限值由幂之和组成,取与为真必存在该权限值,如里只要判断是否有删除权,只需将删除对应的值如(4)取与,为真则存在.

if(true==tb_role_permission.permSum & 2^i){ //结果为True,表示拥有等于“&”右侧整数值权限

echo act[i];

}

}

===其它权限设计思路===

1. 用2的n次幂组成权限值的集合,如1、2、4、8、16...,某用户的权限值为其子集中的整数之和,如 7=1+2+4,5=1+4。如果要从数据库检索包含某几种权限的用户,则先把这几种权限值相加,假设和为k,然后select * from table where 1 and 用户权限值 = 'k';如果要判断某用户有哪些权限,则取出其权限值k,分别用k&1,K&2,K&4,k&16...,如果为真,则 表示有值等于“&”右边整数的权限,例如,如果k&4为真,则此用户有权限表中值等于4的权限;
2.用质数2、3、5、 7、11...组成权限集合,某用户的权限为其子集中各整数的乘积,如 210 = 2*3*5*7,我觉得这种方法很有趣,难点在于如何分解质因数;但我有些不认同原作者的提法,他认为权限之间可能存在包含关系,如某用户有删除权限,则 其一定有浏览权限,要不然就没法删除,事实确实是这样,不过我认为这样太复杂了,容易出错,我觉得权限最好是“原子”的,互不干扰,也就是说某用户有删除 权限而没浏览权限则其无法进行删除操作,因为他看不到东西,解决这个矛盾的关键是在给用户赋权时,把浏览权限也赋给他;
3.不用整数,而 是用“向量表”方法(也许我说的不一定对),把所有可能的权限按一定的顺序排列,如添加、浏览、修改、删除...,用户的权限值为固定100位长度的字符 串,如100010100001....01,从左起每一位对应一种操作权限,如果有这种权限,则此位的值为1,反之,则为0,作者之所以把用户权限值固 定为100位,我想是考虑到升级问题,但我认为这还不够科学,我认为用户的权限值长度应小于权限个数,举例如下:
权限排列表:添加、浏览、修改、删除,用户A有添加和浏览的的权限,则其权限值为11,用户B有浏览和修改的权限则其权限值为011,用户C有浏览和删除的权限则其权限值为0101,这样设计的好处为:当权限表中增加别的权限时,不会影响用户表或角色表;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐