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:
1 parent
7090c8efc2
commit
9103b13510
27 files changed
+1690
-190
No files matched your search
+29
-13
@@ -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 | 名称重复等冲突 |
|
||||
|
||||
|
||||
@@ -119,6 +119,33 @@ cex-agent-admin
|
||||
- 凭证内容 AES 加密存储、只写不回显,编辑留空=不修改
|
||||
- SSH 凭证关联构建节点后即可远程磁盘测试
|
||||
|
||||
## 流水线权限
|
||||
|
||||
**是什么**:按流水线控制「谁能看、谁能发布、谁能改」。未被授权的普通用户看不到任何流水线与发布记录(默认拒绝);管理员始终拥有全部权限。
|
||||
|
||||
**三级权限**:
|
||||
|
||||
| 等级 | 能做什么 |
|
||||
|---|---|
|
||||
| 查看 | 看流水线、发布记录、发布成功/失败日志(只读,不能构建) |
|
||||
| 发布 | 查看 + 触发构建、批量发布、失败重试 |
|
||||
| 管理 | 发布 + 编辑流水线配置、管理该流水线的成员授权 |
|
||||
|
||||
**怎么授权(管理员,系统 → 流水线权限)**:
|
||||
- 新建权限组 → **选择流水线**:直接勾选要授权的流水线(推荐,全程点选)
|
||||
- 或 **名称匹配(高级)**:只写 `cex-*` 这类通配符(`*` 代表任意字符,无需正则),一次授权整批,之后新建的同名流水线自动纳入
|
||||
- 选好权限等级,勾选成员,保存即生效
|
||||
- 也可以在单条流水线里:编辑器顶栏「成员」按钮,给个别人单独授权(作为权限组的例外补充)
|
||||
|
||||
**普通用户能看什么**:
|
||||
- 菜单只剩「发布」组(流水线/批量发布/发布记录)和「文档中心」;资源、集成、GitOps、系统管理类菜单全部隐藏(直接输 URL 也会被拦回)
|
||||
- 流水线列表只显示被授权的;按钮按等级显隐:查看级只有只读入口,发布级出现「执行/保存并运行/重试」,管理级才有「保存/成员」
|
||||
- 新建/删除流水线、凭证/主机/集群/构建节点等资源管理仅管理员
|
||||
|
||||
**技巧**:
|
||||
- AI 助手批量发布同样受控:对未授权的 Job 会在结果里明确标注「无该流水线的执行权限」
|
||||
- 构建日志 SSE 已要求登录(`?token=` 传递会话),未登录直接访问返回 401
|
||||
|
||||
## 常见问题
|
||||
|
||||
**初始密码在哪**:服务器 `data/initial-admin-password.txt` 或 `grep -A6 "已生成管理员账号" logs/flowstack.log`
|
||||
|
||||
Reference in new issue
Block a user