feat(identity): 完成 A2 角色权限与数据范围全栈落地
背景:A2 开卡前完成 H1 权限门,确认权限点目录、特殊权限、SoD 三对、六类数据范围与超管隐式全集口径(ADR-001)。 改动: - shared:30 权限点 / 10 模块目录与元数据、特殊权限 6 编码、SoD 三对、角色与权限树契约;/me 改 dataScopes 多角色并集。 - prisma:expand 迁移新增 permissions / data_scopes;种子按原型口径重写角色权限、数据范围与 8 项特殊授予。 - api:角色 CRUD / 复制 / 停用 / 删除、权限点启动同步、SoD 40304、系统角色保护、六类范围 ScopeContext 与 CustomerDirectory 端口、变更审计与 outbox。 - web:方案 B 主从分栏三角色页面(列表 / 编辑器 / 新建),权限树、范围选择、特殊权限二次确认、保存影响、SoD 冲突、只读态与模板预填。 - 测试:角色集成 13 条 + A2 e2e 1 条;A1 全量回归。 验证:format:check / lint / typecheck / test(306)/ test:int(27)/ A2 e2e(1,复跑通过)/ openapi:export 全绿。
This commit is contained in:
1 parent
f97f97b0cd
commit
61894df401
80 files changed
+14380
-237
No files matched your search
@@ -122,6 +122,7 @@ model Role {
|
||||
|
||||
users UserRole[]
|
||||
permissions RolePermission[]
|
||||
dataScopes DataScope[]
|
||||
|
||||
@@map("roles")
|
||||
}
|
||||
@@ -153,6 +154,41 @@ model RolePermission {
|
||||
@@map("role_permissions")
|
||||
}
|
||||
|
||||
/// 权限点目录(A2-BE-02):唯一事实源在 @lingxi/shared PERMISSION_CATALOG;
|
||||
/// 启动时幂等 upsert 同步,只增不删;前端权限树由目录生成(不手写迁移)。
|
||||
model Permission {
|
||||
code String @id @db.VarChar(64)
|
||||
module String @db.VarChar(32)
|
||||
moduleLabel String @map("module_label") @db.VarChar(32)
|
||||
name String @db.VarChar(64)
|
||||
description String @default("") @db.VarChar(255)
|
||||
isSpecial Boolean @default(false) @map("is_special")
|
||||
sortOrder Int @default(0) @map("sort_order")
|
||||
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
|
||||
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3)
|
||||
|
||||
@@index([module, sortOrder])
|
||||
@@map("permissions")
|
||||
}
|
||||
|
||||
/// 角色数据范围(A2-BE-04):六类范围之一 + 可选授权对象(当前只有「指定客户组」用客户组 id)。
|
||||
/// 一行 = 一个范围类型的一个授权对象;无对象类型(全部 / 本部门 / 负责客户 / 本人创建)只存一行 target_id = NULL。
|
||||
/// 解析后的可见客户集合由 CustomerDirectory 端口计算,不落库(A3 前为空集)。
|
||||
model DataScope {
|
||||
id String @id @db.Char(26)
|
||||
roleId String @map("role_id") @db.Char(26)
|
||||
scopeType String @map("scope_type") @db.VarChar(32)
|
||||
targetId String? @map("target_id") @db.Char(26)
|
||||
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
|
||||
|
||||
role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@unique([roleId, scopeType, targetId])
|
||||
@@index([roleId])
|
||||
@@index([scopeType, targetId])
|
||||
@@map("data_scopes")
|
||||
}
|
||||
|
||||
/// 刷新令牌:jti 作主键、只存哈希;旋转时旧 token 立刻吊销并记录 replaced_by_id
|
||||
model RefreshToken {
|
||||
id String @id @db.Char(26)
|
||||
|
||||
Reference in new issue
Block a user