设计一个权限系统

对于任何一个成熟的系统而言,如何设计权限体系,是我们在项目设计之初就应该考虑的。在笔者看来,一个完善的权限系统可以在保证业务逻辑正确的前提下,尽量保证代码的简洁性和可扩展性。

关系模型

我们需要思考如下几个概念之间的关系:

  1. 用户。
  2. 角色:权限的载体。一个合法用户应该有一个或多个角色。
  3. 资源:系统的模块,需要区分不同权限。
  4. 角色权限:某个角色对某个资源type具有的权限。
  5. 内容权限:某个用户对某个资源id的权限。

除此之外,我们还应考虑用户是否有组的概念,比如:部门。我们可以把不同的组称作域(组或许还有层级关系)或者项目组。此时,角色或者角色权限就需要挂载在组的概念下。

image.png

角色-资源的权限:上图左上角。
重点理解用户-资源id的权限:上图左下角。
在实际设计中,需要根据不同的需求进行简化或者补充。

权限点

权限点如何定义?有权限就是1,没权限就是0?那显然是不够的,举个例子:

eg:对于一个资源列表,对不同角色可以粗略的分为以下权限点:
list(查看),edit(编辑),delete(删除)等。

实现:权限点最好的实现方式枚举类。同时,每个枚举类的数值型标识,采用2的n(n>=0)次幂的方式递增,这样的好处在于,我们可以用位运算来判断权限。
例如:以上3个权限的code分别为:1,2,4。
若此时新增一个管理的权限,那么他的权限可能是上述所有权限的并集:list | edit | delete = 7。
查询一个角色是否有删除权限:operation & delete == delete,其实就是判断对应的位上是否为1。

你可能感兴趣的:(设计一个权限系统)