Skip to content

角色与权限

权限配置是数据墙DBW 安全体系的核心。每个实体通过 permissions 数组定义"哪个角色可以对该实体执行哪些操作"。

权限基本结构

json
{
  "Book": {
    "source": "dbo.Books",
    "permissions": [
      { "role": "anonymous",     "actions": ["read"] },
      { "role": "authenticated", "actions": ["read", "create"] },
      { "role": "editor",        "actions": ["read", "create", "update"] },
      { "role": "admin",         "actions": ["*"] }
    ]
  }
}

每个权限块包含两个核心字段:

字段必需说明
role角色名。系统角色(AnonymousAuthenticated)或用户自定义角色
actions操作数组。可以是字符串、对象或混合形式

操作类型

操作字符串

最简单的形式,直接列出操作名:

json
{ "role": "reader", "actions": ["read"] }

操作对象

需要字段控制或策略时,使用对象形式:

json
{
  "role": "auditor",
  "actions": [
    {
      "action": "read",
      "fields": {
        "include": ["*"],
        "exclude": ["salary"]
      },
      "policy": {
        "database": "@item.status eq 'published'"
      }
    }
  ]
}

对象形式支持三个子字段:

字段说明
action操作名(readcreateupdatedeleteexecute
fields字段过滤(include / exclude
policy数据库策略(行级过滤表达式)

混合形式

同一角色的不同操作可以使用不同形式:

json
{
  "role": "editor",
  "actions": [
    { "action": "read", "fields": { "include": ["*"] } },
    "create",
    "update"
  ]
}

操作与数据库对象的对应关系

操作视图存储过程
read
create若可更新
update若可更新
delete若可更新
execute
*= CRUD= CRUD(若可更新)= execute

权限判定

引擎对每个请求按以下规则判定权限:

text
请求操作(如 GET /api/Book)→ 映射为 read

查找当前角色在 Book 上的权限块
  ├── 权限块中有 "read" → 允许
  ├── 权限块中有 "*"   → 允许(通配符匹配)
  ├── 权限块中无匹配项  → 403 Forbidden
  └── 该角色无权限块    → 沿继承链查找 → 仍无 → 403 Forbidden

如果请求的操作被拒绝,引擎返回 403 Forbidden,不区分"角色不存在"和"角色存在但无权执行此操作"。

CLI 配置权限

bash
# 授予单个角色单个操作
dab update Book --permissions "anonymous:read"

# 授予单个角色多个操作
dab update Book --permissions "authenticated:read,create,update"

# 授予多个角色
dab update Book --permissions "anonymous:read" --permissions "authenticated:*"

# 带策略的权限
dab update Order --permissions "customer:read" \
  --policy-database "@item.customerId eq @claims.userId"

CLI 中权限格式为 "角色名:操作1,操作2"。多次指定 --permissions 会添加多个角色块。--permissions覆盖式更新——新的值会替换该角色在该实体上的全部现有权限。

常见配置模式

只读开放

匿名用户可以读取,但所有写操作需要认证:

json
{ "role": "anonymous", "actions": ["read"] },
{ "role": "authenticated", "actions": ["*"] }

分层权限

不同角色有不同的操作范围:

json
{ "role": "viewer", "actions": ["read"] },
{ "role": "editor", "actions": ["read", "create", "update"] },
{ "role": "admin",  "actions": ["*"] }

仅特定角色可访问

完全私有,只有指定角色能操作:

json
{ "role": "admin", "actions": ["*"] }

不配置 anonymousauthenticated 时,这些系统角色继承不到权限,请求一律被拒绝。

只读存储过程

json
{ "role": "anonymous", "actions": ["execute"] }

操作分离

读对所有人开放,写只对管理员开放:

json
{ "role": "anonymous", "actions": ["read"] },
{ "role": "admin",     "actions": ["create", "update", "delete"] }

注意事项

注意事项说明
角色名大小写用户角色区分大小写,Editoreditor 是不同的角色
权限覆盖CLI 的 --permissions 是覆盖式更新,不会合并
最小权限原则只授予角色完成任务所需的最小操作集
存储过程的 *对存储过程实体,* 仅等于 execute,不会意外暴露增删改
anonymousUnauthenticated使用 Unauthenticated 认证时所有请求都是 anonymousauthenticated 和命名角色永远不会生效

下一步

数据墙DBW 产品文档与开发指南。