权限设计
大概有这几种模式
用户+组+角色+权限
用户+组+权限
用户+角色+权限
用户+权限
最近看了别人的设计方法大多以“整数”来表示权限值如添加、浏览、删除和修改分别用1、2、4、8这几个整数来代替不过各人的做法有所不同举例如下
1.用2的n次幂组成权限值的集合如1、2、4、8、16...某用户的权限值为其子集中的整数之和如 7=1+2+45=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这样设计的好处为当权限表中增加别的权限时不会影响用户表或角色表
4.我曾经的做法在后台管理中把权限分为两大类栏目权限和操作权限每个栏目对应一个目录操作权限细分为浏览、添加、修改和删除用户进入系统后首先判断有没有栏目权限然后判断有没有操作权限判断栏目权限相对简单一些首先获取访问页面的路径path然后分解出目录对应用户拥有的目录权限如果此目录包含在用户有权管理的目录数组中从数据库取出则其有进入此目录的权限否则没有然而在判断操作权限好象有些麻烦但突然想到添加、浏览、修改和删除与我的文件命名规则是基本是对应的但有点不同的是我把添加和删除的功能合并在一个文件中了例如文件名为proAddEdit.php幸好意识到修改文件时多了个传递参数id于是我用正则解决了这个问题今天看来这种方法似乎过时了因为不适应面向对象的思想和用框架体系来开发系统
以上是个人粗浅的认识和描述若有错误请各位指正希望高人给些意见