权限管理概览

本文档详细描述了系统的权限管理机制,包括多角色权限继承、行权限自动传播、变量模板解析等核心功能。

核心概念

实体定义

概念定义属性说明
用户系统的使用者可关联多个角色,权限为多角色叠加结果
角色权限的集合,代表一类职能或岗位可被多个用户共享,如管理员、普通用户等
Schema(实体)数据模型定义包含属性(Property),属性可通过 ref 关联其他实体

权限维度

多角色权限继承

权限获取流程

用户可拥有多个角色,系统在获取权限时会自动合并所有角色的权限:

合并规则

表权限合并

  • 规则:取各角色中最宽松的权限
  • 优先级:可写 > 只读 > 无权限

行权限合并

  • 规则:取各角色行权限的并集(逻辑"或")
  • 实现:使用 $or 运算符合并多个角色的过滤条件

列权限合并

  • 规则:白名单优先,任一角色允许即允许访问

行权限自动传播

设计目的

当实体之间/实体和事件之间存在关联关系(通过实体类型的字段)时,被指向的 Schema 的行权限可以自动传播给当前 Schema,减少重复配置。

传播规则

传播算法

系统使用图算法实现行权限自动传播:

  1. 构建图:每个 Schema 作为节点,ref 关系作为边
  2. 识别叶子节点:找出所有出边为 0 的节点(无引用其他实体)
  3. 权限传播
    • 如果叶子节点有行权限
    • 且只有一个父节点引用它(单一引用来源)
    • 则将权限传播给父节点
  4. 迭代处理:删除已处理的叶子节点,重复步骤 2-3

传播条件

条件说明
叶子节点有行权限只有配置了行权限的节点才会传播
唯一引用来源父节点只有一个 ref 指向当前节点
引用字段名称传播后的权限以 ref 字段名为键

传播示例

假设有以下数据模型和权限配置:

// Schema 定义
地理位置: {
  _id: "location",
  properties: [
    { name: "id", type: "string" },
    { name: "名称", type: "string" },
    { name: "大区", type: "string" }
  ]
}

店铺: {
  _id: "shop",
  properties: [
    { name: "id", type: "string" },
    { name: "名称", type: "string" },
    { name: "位置", type: "object", ref: "location" }  // 引用地理位置
  ]
}

场景:在地理位置表上设置了"大区 = 华东大区"的行权限。

// 权限配置
地理位置.rowPermissions = {
  "大区": { "$eq": "华东大区" }
}

传播后,店铺表的权限自动变为:

店铺.rowPermissions = {
  "位置": {    // 使用 ref 字段名"位置"作为键
    "schema": "location",
    "query": {
      "大区": { "$eq": "华东大区" }
    }
  }
}

效果:单独查询店铺表时,只能查到"位置"属于华东大区的店铺。

传播限制

以下情况不会传播权限:

  • 多个父节点引用同一个子节点(避免歧义)
  • 叶子节点没有配置行权限
  • 存在循环引用

变量模板解析

支持的变量

系统支持在行权限中使用变量模板,实现动态权限控制:

变量说明示例
{{$user.字段名}}引用当前用户的字段值{{$user.store}}
{{$nRole}}当前用户的角色列表{{$nRole}}

前端操作示例

变量模板配置

使用示例

// 配置时使用变量模板
rowPermissions = {
  "店铺ID": {
    "$eq": "{{$user.store}}"  // 用户 store 字段的值
  }
}

// 解析后(假设用户 store = "shop123")
rowPermissions = {
  "店铺ID": {
    "$eq": "shop123"
  }
}

完整处理流程

配置建议

角色设计

  1. 按职能划分:如管理员、区域经理、店员等
  2. 避免重叠:减少角色间权限冲突
  3. 粒度适中:过细会增加管理成本

权限配置

  1. 优先在叶子实体配置:利用自动传播减少重复配置
  2. 合理使用变量:实现基于用户属性的动态权限
  3. 定期审查:确保权限配置与业务需求一致

常见场景

场景建议配置
店员只能看本店数据在店铺实体配置 id = {{$user.store}},订单自动继承
区域经理看多店数据在店铺实体配置 region = {{$user.region}}
管理员看全部数据不配置行权限(默认全可见)

附录

术语表

术语解释
Schema数据模型/实体定义
PropertySchema 的属性/字段
ref属性的引用关系,指向另一个 Schema
行权限对数据行的访问过滤条件
变量模板用于动态替换的占位符,如 {{$user.store}}