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

来源:互联网 发布:李睿北医者怎么样知乎 编辑:程序博客网 时间:2024/04/30 12:00

权限控制管理在办公系统和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,这样设计的好处为:当权限表中增加别的权限时,不会影响用户表或角色表;