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/resources | owner 字段目录 |
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/resourcesGET/POST /api/authorization/sharing/rulesGET/PUT/DELETE /api/authorization/sharing/rules/{ruleId}POST /api/authorization/sharing/rules/previewPOST /api/authorization/sharing/decisionPOST .../{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 读取同时检查审批完成、主动撤销和服务器绝对时间,因此清理作业延迟不会延长权限窗口。
创建时目标为空表示本人;目标、角色、理由与 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. 源码验证
先验证生成端点、权限动作与生产清单仍一致,再执行高级授权回归;这能把“入口没有生成”和“裁决行为错误”分开定位:
# 入口、动作、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# 高级授权用例、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