Skip to content
bitzorcas
中EN

Guide

Authorization 高级治理、测试与运维

说明字段安全、数据分类、共享规则、分权管理员、权限反查与模拟、工作流权限申请,以及对应的测试和故障边界。

Last updated

Authorization 已不再只有 RBAC、ABAC、ReBAC 与 Feature 决策器。当前管理面还包含字段级安全、数据分类、统一共享授权、分权管理员、权限反向报表、有效权限模拟和工作流驱动的临时授权。它们共用可信租户、稳定主体键、乐观并发、统一错误码和审计边界,但各自解决不同问题。

1. 能力地图

能力解决的问题当前生产接入
字段安全谁能看到或修改一个字段identity.user,22 个公开字段、11 类执行面
数据分类字段的租户分类标签Default / Sensitive / Restricted
共享规则资源 owner 之外的主体能否读写实例tickets.ticket,详情、列表、搜索、附件、导出和写命令
分权管理员管理权限可作用于哪些用户Office、Department、UserGroup
权限反查某主体的权限来自哪里RBAC、范围、共享、字段策略、分权与临时申请
权限模拟在不写数据时解释一次决策目录 + 只读模拟端点
权限申请经审批产生有绝对期限的临时角色标准 Workflow、撤销、到期和提交恢复

这张表是当前已登记范围,不是平台对所有模块的自动覆盖。新增 owner 必须贡献目录、执行 manifest 和真实消费者契约;只新增管理页面不会让业务读写自动受控。

2. 字段安全

字段目录由数据 owner 编译期提供,租户不能创建任意资源或字段代码。当前 identity.user 包含 userId、displayName、email、phone、组织关系、角色、账号状态和访客信息等 22 个公开字段;密码、哈希、令牌与内部搜索哈希从不进入目录。

读取效果按最小权限合并:Hidden > Masked > Visible;写入效果为 ReadOnly > Editable。策略主体只支持租户 Role 和 Identity UserGroup,运行时从权威关系重新解析,不能信任客户端或旧 JWT 中的角色声明。无显式策略时回到 owner 基线;例如 phone 的基线读取为 Masked,物理保护固定为 SensitiveEncrypted,租户策略不能关闭加密。

每个目录资源必须登记真实执行面。identity.user 当前覆盖详情、列表、选项、创建、更新、导入、批量、导出、搜索、审计投影和工作流响应。目录与执行登记缺失、重复或不一致时整体失败关闭。

主要路由:

方法与路由语义
GET /api/authorization/field-security/resourcesowner 字段目录
GET /api/authorization/field-security/policies按资源、字段、主体和状态分页
POST /api/authorization/field-security/preview无副作用预览完整矩阵
PUT /api/authorization/field-security/policies/bulk按主体批量继承或覆盖
POST/PUT/DELETE .../policies[/{policyId}]单条策略生命周期

管理权限为 authorization.field-security.view 与 .manage。保存使用 Version;矩阵中的 Inherit=true 表示删除显式策略并恢复 owner 基线。

3. 数据分类不是字段权限

数据分类记录当前租户对字段的 Default、Sensitive 或 Restricted 标签,用于扫描、展示、搜索、导出和日志治理;字段安全则裁决具体主体的 Visible/Masked/Hidden 与 Editable/ReadOnly。两者不能互相替代。

GET /api/authorization/data-classification/catalog/{resourceCode} 返回 owner 目录与显式覆盖,PUT /api/authorization/data-classification/{resourceCode}/{fieldCode} 按 ExpectedVersion 保存,POST .../impact-preview 在写入前返回引用该字段的字段安全策略数量。未知资源、未知字段和非法分类均返回稳定错误,不落一条自由文本配置。

4. 统一共享授权

共享是 allow-only 增益,不覆盖显式 Deny、RBAC、DataScope 或 owner 自身关系。规则使用 owner 提供的字段目录、当前资源快照和权威主体关系实时计算;目标可以是 User、UserGroup 或 Role,访问级别为 Read 或 Write。

当前只有 tickets.ticket 完成生产 manifest,条件字段包括 status、priority、type、severity、requesterId、assigneeId、projectId、sprintId、tags 和 dueAt。规则支持 All/Any、等于/不等于、集合、空值和时间比较。业务侧只能调用 ISharingResourceAuthorizationResolver,不得绕过它直接解释规则。

管理端点覆盖资源目录、规则 CRUD、无副作用预览、权威 decision,以及可恢复的影响扫描:

  • GET /api/authorization/sharing/resources
  • GET/POST /api/authorization/sharing/rules
  • GET/PUT/DELETE /api/authorization/sharing/rules/{ruleId}
  • POST /api/authorization/sharing/rules/preview
  • POST /api/authorization/sharing/decision
  • POST .../{ruleId}/recalculations 与 POST .../{operationId}/advance

在线授权仍实时读取规则和 owner 快照;recalculation 是影响评估与运营证据,不是授权正确性的缓存前提。

5. 分权管理员

分权授权把“允许执行哪些管理权限”与“允许管理哪些用户”绑定在一起。范围只接受 Identity owner 验证的 Office、Department 或 UserGroup;授权可以定时生效、绝对到期或主动撤销,更新与撤销均校验 Version。

/api/authorization/delegated-admin/catalog 返回可委托动作与风险级别,/preview 展开当前范围成员,/effective 返回当前用户的有效动作与范围并集。用户与权限申请管理用例会在服务端调用范围校验,不能把前端列表过滤当作隔离。

6. 权限反查与模拟

权限反向报表以主体为入口,合并 Role、UserGroup、Position、ReportingRelationship、DataScope、SharingRule、FieldSecurityPolicy、DelegatedAdmin 和 PermissionRequest 来源。GET /api/authorization/permission-audit 返回分页明细,POST .../export 创建异步导出任务;导出权限与查看权限分离。

GET /api/authorization/permission-simulation/catalog 提供可模拟的资源与动作,POST /api/authorization/permission-simulation 只读执行当前授权链并返回有效主体、命中策略、obligations 和最终原因。它不会创建关系、临时授权或业务资源,也不能替代业务 owner 对资源事实的校验。

7. 工作流权限申请

权限申请不是向永久 UserRole 写一条带备注的数据。SysPermissionAccessRequest 自身就是临时授权来源,在线 RBAC 读取同时检查审批完成、主动撤销和服务器绝对时间,因此清理作业延迟不会延长权限窗口。

workflow startedstart failedrequester retryapproval reservedworkflow committedserver timeserver timeserver time

Submitting

PendingApproval

SubmissionFailed

Provisioning

Active

Rejected

Cancelled

Revoked

Expired

创建时目标为空表示本人;目标、角色、理由与 ExpiresAt 均由服务端校验。同一目标与角色不能存在重复开放申请。审批人不能审批自己的申请;驳回意见必填;只有申请人能取消或重试 SubmissionFailed;撤销 Active 授权必须提供原因与 ExpectedVersion。

工作流用 taskId 做重复审批幂等键,在推进前预留 Provisioning,提交完成后再激活。申请号也是工作流启动的稳定业务键,启动失败可恢复,不会重复发起多个流程。

8. HTTP 与权限边界

当前 OpenAPI 有 46 条 /api/authorization 路径。管理端点仍通过统一 ResourceDescriptor 派生权限;个人申请的 mine 路由只允许读取本人发起或作为目标的数据,不能因为不实现管理型 IAuthorizationModuleRequest 就越过主体约束。

高风险错误至少应区分:目录或 owner 不可用、跨租户、主体停用、版本冲突、规则无效、范围外管理、申请已决策、申请过期与工作流提交失败。客户端不得把 403、409、422 和 503 合并成“保存失败”。

9. 回归矩阵

  • 字段策略覆盖详情、列表、搜索、导入、导出、审计和工作流响应,且 Masked/Hidden 不进入排序、筛选或旁路投影;
  • Identity 角色/用户组关系变化后字段裁决立即使用权威关系;
  • Ticket 共享覆盖详情、列表、搜索、评论、附件、导出和写命令,跨租户 owner 快照失败关闭;
  • 分权管理员的基础 RBAC、委托动作、范围成员、到期和撤销分别做正反测试;
  • 权限反查与模拟解释同一次权威决策,导出遵守字段安全与租户边界;
  • 权限申请覆盖自审拒绝、重复开放、工作流启动失败重试、重复审批、到期、撤销和缓存失效;
  • SqlSugar 与 EF Core 对所有策略表、自然键、软删除和 Version 行为一致。

10. 源码验证

先验证生成端点、权限动作与生产清单仍一致,再执行高级授权回归;这能把“入口没有生成”和“裁决行为错误”分开定位:

Terminal window
# 入口、动作、owner 接缝与字段安全执行面。
rg -n "GenerateEndpoint|AuthorizationAction|ISharingResourceAuthorizationResolver" \
src/Platform/Authorization -g '*.cs'
rg -n "requiredExecutionSurfaces|tickets.ticket" \
docs/architecture/00-governance/manifests/0017-field-security-resource-catalog.json
Terminal window
# 高级授权用例、owner 接入与工作流权限申请。
dotnet test tests/BitzOrcas.Application.Tests \
--filter "FullyQualifiedName~FieldSecurity|FullyQualifiedName~Sharing|FullyQualifiedName~DelegatedAdmin|FullyQualifiedName~PermissionRequest"
# 目录完整性、执行面绑定与持久化隔离。
dotnet test tests/BitzOrcas.Architecture.Tests \
--filter FullyQualifiedName~Authorization

上一页:配置、持久化与缓存 · 返回 Authorization 概览

100%

滚轮或按钮缩放 · 放大后拖动画面 · 双击切换 100% / 200%