在Web开发中关于权限管理设计大抵涉及到两个方面:一:功能方面权限设计;二:资源方面权限设计。二者比较来看,功能方面权限的可重用性更高。

1.关于权限:

  • 按照角色权限的最简单的设计

    名称 描述
    用户 不具备管理功能
    管理员 具备管理普通用户的权限
    超级管理员 具备管理管理员的权限


    上面的设计直接将参与系统的用户分为三类角色:用户,管理员,超级管理员。

  • 按照角色权限,粒度划分再小些设计

    名称 权限 描述
    普通用户 普通服务 享有系统有限服务
    VIP用户 高级服务 享有VIP服务



    上面是用户的简单划分示例,通过将用户进行权限划分,来提供不同的服务。

    名称 权限 描述
    产品管理员 管理产品模块 具备产品模块的管理操作权限
    客户管理员 管理客户模块 具备客户模块的管理操作权限



    上面是管理员的简单划分示例,通过将后台管理员进行权限划分,使的每一个管理员角色具备不同的操作权限,并且不同角色的管理员在管理角色上不存在交叉管理,这样系统的管理部分才有可能保存清晰,完整,有效。

    名称 权限 描述
    超级管理员 管理各类管理员 具备最高的管理权限
    系统管理员 管理整个系统,包括管理超级管理员 系统管理员具备操作整个系统的最高权限



    上面是系统级别的管理简单划分示例,一个系统建设完成后应该具备自管理的功能,即:系统环境配置,模块管理,使用系统的干系人管理等都可以通过自身的管理模块完成,而不是人为的修改数据或者系统程序。

  • 按照模块对角色具备的操作权限进行划分,粒度将更细。对于模块层的权限划分使得系统权限管理严格,个角色的智能更加精确,当然系统的设计,实现也相对复杂。

    2.用户-角色-权限的一个物理模型

    设计示例图如下所示:

    Web开发中的用户角色权限设计总结_第1张图片

说明:

a.用户-用户角色-角色:可以构成一个用户角色权限管理子模块,即1中最简单的设计。

b.模块-模块权限-权限:可以构成一个模块权限管理子模块。注:这里的描述有些欠缺,单独的看待模块部分,应该描述为模块-模块功能-功能更为恰当。

c.将a和b同过角色权限组合在一起就可以构成一个用户-角色-权限的按照功能模块粒度划分的权限管理系统。

3.用户-角色-权限数据库中表之间的关联关系说明:

Web开发中的用户角色权限设计总结_第2张图片

上述数据库表的关系图中的每一张表不涉及具体的字段内容,所具备的字段都是为了描述各个表之间的关联关系。

实体表:用户表,角色表,权限表,模块表;

中间表:用户角色,角色权限,模块权限表,用来解决多对多问题;

角色权限表:涉及角色具备的权限,该权限是来自模块权限,也就是符合2中的模块权限。

关于角色权限表是用户-角色-权限系统的一个可扩展口。例如:角色权限可以和权限直接关联,或者二者之间添加特定场景的其他表。

4.数据库用例数据,使用用户-角色-权限系统

  • 用户

    111212500.png三个用户(标识列[主键],用户编码,用户名称)

  • 角色

    Web开发中的用户角色权限设计总结_第3张图片

    四种角色(标识列[主键],角色编码,角色名称)

  • 用户角色

    111516931.png

    用户角色标识列,用户编码,角色编码即构成用户角色中间表。注:实际中一个用户足矣具备多种角色。

  • 模块

    Web开发中的用户角色权限设计总结_第4张图片

    [模块标识列,模块编码,模块名称,父模块编码,模块URL]

    说明:

    父模块编码:用于模块划分粒度层次标识

    模块URL:用于模块在WBE应用中的访问标识,当然也可以作为他用。

  • 权限

    Web开发中的用户角色权限设计总结_第5张图片

    权限标识,权限编码,权限名称。

  • 模块权限

    Web开发中的用户角色权限设计总结_第6张图片

    模块权限标识列,模块编码,权限编码。模块权限表在模块粒度和权限粒度上对模块进行的相应的权限设置,可以简单表述为:具备在某一模块上的某种权限操作。因此将角色和模块权限进行关联将成为角色具备这一粒度层次上的操作权限。

  • 角色权限

    Web开发中的用户角色权限设计总结_第7张图片

    角色权限标识列,角色编码,模块权限编码


至此,用户,角色,权限的划分就形成了,而且可以通过实际中需要的用户,角色,权限的管理程度,进行简化或者增加表。


5.查询用户编码为400900500的权限


SELECT
    t_account.ACCCODE, t_account.ACCNAME,
    t_role.ROLECODE, t_role.ROLENAME,
    t_module_privilege.MODUELCODE,
  t_module.MODUELCODE, t_module.MODUELNAME,
    t_privilege.PRICODE, t_privilege.PRINAME
FROM
    t_account, t_account_role, t_role, t_role_privilege, t_module_privilege, t_module, t_privilege
WHERE
    t_account_role.ACCCODE=t_account.ACCCODE AND t_account_role.ROLECODE=t_role.ROLECODE
AND
    t_account.ACCCODE="400900500"
AND
    t_role_privilege.ROLECODE=t_role.ROLECODE   AND t_role_privilege.MPID=t_module_privilege.MPID
AND
    t_module_privilege.MODUELCODE=t_module.MODUELCODE AND t_module_privilege.PRICODE=t_privilege.PRICODE

通过面的SQL语句可以查询到400900500用户的权限。


Web开发中的用户角色权限设计总结_第8张图片


上述查询仅仅说明各表之间的数据关联关系,在实现开发中这样的查询避免使用。


用户,角色,权限的一个很好的参考示例就是Oracle数据库的用户管理机制。Web开发中更多的是涉及到管理用户,管理员,系统管理,模块访问权限,资源访问等问题的处理。


关于用户角色权限管理有程序的开发系统,参见如:http://www.oschina.net/p/limiton。