Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4049746
  • 博文数量: 272
  • 博客积分: 7846
  • 博客等级: 少将
  • 技术积分: 6476
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-25 16:27
文章分类

全部博文(272)

分类: 系统运维

2011-10-28 17:46:49



    以前开发的系统都是中小型系统,而且面向的多是业务固定的企业。因此,以前自己设计的权限管理都是通过一张二维表表示的:

  1. id _in _read _write _dump _backup
  2. 1001 1    1    0    0     0
  3. 1002  0    0    0    0     0
  4. 1003  1    1     1    1     0
    于是,一个小型矩阵就出现了,配合数据库MySql中的相关字段:
  1. id name gender    acl     email
  2. 1001 张三     男   11000   ok@ok.com
    再写一个readAcl类,每次根据具体的值得出相应的权限。这是小打小闹而已,因为:
    1、数据大量冗余
    当数据多的时候,就是说系统使用人数多的时候,或者部门业务较多,表中列就有二三十行的情况下,就会产生浪费,引发数据库反映变慢,究其原因在于这种方式太精细化了,可以控制每个人的每个活动。其实不需要这么设置,因为很多人只有几个项目有权限,别的权限相就都是0,如果真的发生了那样的事情,呵呵,咱们看到的表会是一个处处是0,几乎都看不见1的一个大表格。这不是浪费是什么。
    2、可扩展性差
    数据冗余就说明了,此处需要改进,而且那么多重复数据,第一眼看去就想给他面向对象进行拆分进行重用,呵呵,可惜那是数据库,虽不能面向对象,但可以拆表。其实,大家可以设想一下,如果这个公司业务发展情况良好,不久又兼并了一个新业务,那么咱就得在这个大表中再新增添一个列,又出现N多个0和极少量的1。如果说这你可以容忍,那么每次都对这个表增加列你还能容忍么?增加列之后,人员数据表里的acl字段值你就必须每次都重写一遍,因为之前是11000(五位),现在所有人都变为110000(六位),如果还有别的表也用到这个值呢?别忘了,你还得对PHP程序进行修改呢。
    总之,你说麻烦不麻烦。


    我靠,那怎么办?
    是的,我也发愁ing。突然我想到了Linux,这可是可以一机带超多个用户的系统,它的权限设计是按组来分的。灵感告诉我,这是个好点子。于是我查看了Discuz和Joomla的用户权限设置,思路都是一样:按组分配权限。
    万岁,首先还是那张用户表,可以固定字段罗
  1. id name gender    group    email
  2. 1001 张三     男      0     ok@ok.com
    这张表里变得更简单了,就一个数,代表组ID。
    接着设定组权限表:
  1. id _in _read _write _dump _backup
  2. 0 1    1    1    1     1
  3.  0    0    0    0     0
  4.  1    1     0    1     0
    如果遇到需要新增业务的话,直接对组权限表增加列即可,并不影响别的表。
    接下来就是一个简单的组员表了。
  1. gid id
  2. 0 1001
  3. 0 1003
  4. 1 1129
  5. ............

    这种做法在遇到超大量数据时都没有问题。关键是极好地解决了权限分配问题。其实看起来是种树状结构:
  1. groupA:
  2. 张三
  3. 李四
  4. groupB:
  5. 王五
  6. 赵六
  7. 陈七
  8. groupC:
  9. 周八
      这一点,就写到这吧。




阅读(7296) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

xdsnet2011-10-30 08:28:08

linux下一个ID可以属于多个组的。
这个在扩展是可能更好,但在确定权限时就更复杂了,每个人都权限需要取得所有组的权限做并集。