feat: 流水线三级权限体系(手动多选+通配符授权)+ 菜单分级 + SSE 认证修复

权限模型(借鉴 Jenkins Role-Strategy 与云效,默认拒绝):
- 三级权限:查看(流水线+成功/失败日志)/ 发布(+构建、批量发布、重试)/ 管理(+配置、成员);admin 全局豁免
- 权限组(管理员配置):默认手动多选流水线(免正则,操作友好);高级模式仅 * 通配符(cex-*)
- 单流水线成员直授权作为例外补充;AI 批量发布逐 job 校验,越权明确拒绝

后端:
- 新增 PipelineRole/PipelineMember 表与 /api/pipeline-roles、/api/pipelines/:id/members CRUD
- RequirePipelineAccess/RequireRunAccess 中间件挂全流水线与运行路由;列表按可见性过滤并附 accessLevel/canRetry
- /api/me 会话接口;logs/stream SSE 支持 ?token= 认证(原先完全免鉴权)并校验查看权限
- 凭证/主机/集群/构建节点/工具/Webhook/Jenkins/GitOps/插件/设置全部 AdminOnly;触发人以会话身份落库

前端:
- useSession 会话 hook;Sidebar 菜单分级(资源/集成/系统管理 admin-only);admin 路由守卫
- 按钮级权限:执行/配置/删除/保存/重试按等级显隐;新页「流水线权限」与流水线成员弹窗(纯点选)
- 登录页记住密码;GUIDE/API 文档补权限章节
This commit is contained in:
Logan.Li committed 2026-10-27 17:34:41 +08:00
1 parent 7090c8efc2
commit 9103b13510
27 files changed
+1690 -190

No files matched your search

+29 -13
View File
@@ -37,25 +37,41 @@ LDAP 用户名在目录验证通过后自动建号/同步(JIT);错误统
| 接口 | 方法 | 说明 |
|---|---|---|
| `/api/pipelines` | GET | 列表(每条附 `lastRun` 最近运行) |
| `/api/pipelines` | POST | 创建(name 必填;deployType: host/kubernetes 值为 `k8s`/gitops) |
| `/api/pipelines/:id` | GET | 详情(pipeline + nodes + edges + lastRun) |
| `/api/pipelines/:id` | PUT | 更新(白名单字段,含触发器/变量/缓存) |
| `/api/pipelines/:id` | DELETE | 删除(级联删节点连线) |
| `/api/pipelines/:id/nodes` | PUT | 全量保存画布节点 |
| `/api/pipelines/:id/edges` | PUT | 全量保存画布连线 |
| `/api/pipelines/:id/runs` | POST | 触发运行(body 可带 branch/env/triggerType) |
| `/api/pipelines` | GET | 列表(每条附 `lastRun` 与 `accessLevel`;普通用户仅返回被授权的) |
| `/api/pipelines` | POST | 创建(**管理员**) |
| `/api/pipelines/:id` | GET | 详情(pipeline + nodes + edges + lastRun + `accessLevel`;需「查看」) |
| `/api/pipelines/:id` | PUT | 更新(需「管理」) |
| `/api/pipelines/:id` | DELETE | 删除(**管理员**;级联删节点连线) |
| `/api/pipelines/:id/nodes` | PUT | 全量保存画布节点(需「管理」) |
| `/api/pipelines/:id/edges` | PUT | 全量保存画布连线(需「管理」) |
| `/api/pipelines/:id/runs` | POST | 触发运行(需「发布」;body 可带 branch/env/triggerType) |
`type=jenkins` 且已关联服务器的流水线触发时走真实 Jenkins 引擎(队列→构建→增量日志回传)。
## 流水线权限
三级等级:`viewer` 查看 / `operator` 发布 / `owner` 管理;管理员全局豁免。未被授权的普通用户默认不可见任何流水线。
| 接口 | 方法 | 说明 |
|---|---|---|
| `/api/me` | GET | 当前会话(username/role/isAdmin) |
| `/api/pipeline-roles` | GET | 权限组列表(**管理员**;附 matchedPipelines 匹配数) |
| `/api/pipeline-roles` | POST | 创建(name/scopeMode=manual|pattern/pattern/pipelineIds/level/members;pattern 仅支持 `*` 通配符) |
| `/api/pipeline-roles/:id` | PUT/DELETE | 更新 / 删除(**管理员**) |
| `/api/pipelines/:id/members` | GET | 单流水线直接成员 + 命中的权限组(需「查看」) |
| `/api/pipelines/:id/members` | POST | 添加/更新成员等级(需「管理」;body: username/level) |
| `/api/pipelines/:id/members/:mid` | DELETE | 移除直接授权(需「管理」) |
资源(主机/集群/凭证/构建节点/工具/Webhook)、Jenkins 服务器、GitOps、插件与系统设置接口均要求**管理员**。
## 运行记录
| 接口 | 方法 | 说明 |
|---|---|---|
| `/api/runs` | GET | 运行列表(`?pipelineId=&status=`) |
| `/api/runs/:runId` | GET | 详情(run + stages + logs;失败含 AI `analysis`) |
| `/api/runs/:runId/logs/stream` | GET | SSE 实时日志(免鉴权;事件 connected/log,历史先回放) |
| `/api/runs/:runId/retry` | POST | 以同分支重新触发 |
| `/api/runs` | GET | 运行列表(`?pipelineId=&status=`;普通用户仅返回被授权流水线的,每条附 `canRetry`) |
| `/api/runs/:runId` | GET | 详情(run + stages + logs;失败含 AI `analysis`;需「查看」) |
| `/api/runs/:runId/logs/stream` | GET | SSE 实时日志(需登录:`?token=` 传会话 token 且需「查看」;事件 connected/log) |
| `/api/runs/:runId/retry` | POST | 以同分支重新触发(需「发布」) |
## AI 与批量发布
@@ -133,7 +149,7 @@ curl -X POST http://localhost:9527/api/ai/release \
|---|---|
| 400 | 参数错误 / 未启用对应功能 |
| 401 | 未登录 / token 过期 / 用户名或密码错误 |
| 403 | 需要 admin 角色 |
| 403 | 需要 admin 角色 / 无该流水线的对应权限等级 |
| 404 | 资源不存在 |
| 409 | 名称重复等冲突 |