-
Notifications
You must be signed in to change notification settings - Fork 101
将helm纳入统一的权限管理 #261
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
将helm纳入统一的权限管理 #261
Conversation
实现CheckPermissionLogic函数用于检查用户对集群资源的操作权限 包括平台管理员、集群管理员、只读权限和Exec权限的校验 支持命名空间黑白名单机制进行细粒度权限控制
重构权限检查逻辑,将其从cb包移动到comm包以提升代码组织性 移除cb.go中未使用的导入和重复的权限检查代码
将helm仓库相关路由移至admin分组并重构为控制器结构 统一权限检查逻辑,简化重复代码 新增无集群的helm命令构造函数 更新前端api路径匹配新的路由结构
将helm chart相关路由从主路由移至单独控制器 更新前端api路径以匹配新的路由结构
将分散的helm路由注册逻辑集中到HelmReleaseController中 通过RegisterHelmReleaseRoutes方法统一注册路由
在helm release相关接口中添加权限检查逻辑 移除getHelmWithNoCluster函数中未使用的context参数
📝 WalkthroughSummary by CodeRabbit
Walkthrough本次变更对 Helm 相关的控制器、路由注册和权限校验逻辑进行了结构化重构。Helm 的发布、Chart、仓库相关 HTTP 路由注册被集中到各自的注册函数中,控制器方法由函数改为结构体方法。权限校验逻辑从内联实现迁移到 comm 包的统一入口,并新增了无集群上下文的 Helm 客户端构造器。同时,前端 UI 的 Helm 相关 API 路径同步调整。 Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant UI
participant GinRouter
participant HelmController
participant comm
User->>UI: 发起 Helm 相关请求
UI->>GinRouter: 请求 /mgm/helm/... 或 /admin/helm/...
GinRouter->>HelmController: 分发到对应 Controller 方法
HelmController->>comm: CheckPermissionLogic 权限校验
comm-->>HelmController: 返回校验结果
HelmController->>HelmController: 业务处理
HelmController-->>UI: 返回响应
Possibly related PRs
Poem
✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🔭 Outside diff range comments (4)
pkg/controller/helm/helm_repo.go (3)
86-113
: DeleteRepo 方法缺少权限检查与
AddOrUpdateRepo
类似,这个方法允许任何用户删除 Helm 仓库,存在严重的安全风险。建议在删除操作前添加权限检查:
func (r *HelmRepoController) DeleteRepo(c *gin.Context) { ids := c.Param("ids") + + // 检查权限 + _, _, err := handleCommonLogic(c, "delete", "", "", "helm-repo") + if err != nil { + amis.WriteJsonError(c, err) + return + } h, err := getHelmWithNoCluster()
114-130
: UpdateReposIndex 方法缺少权限检查更新仓库索引操作同样需要权限控制。
建议添加权限检查:
func (r *HelmRepoController) UpdateReposIndex(c *gin.Context) { var req struct { IDs string `json:"ids"` } if err := c.ShouldBindJSON(&req); err != nil { amis.WriteJsonError(c, err) return } + + // 检查权限 + _, _, err := handleCommonLogic(c, "update", "", "", "helm-repo") + if err != nil { + amis.WriteJsonError(c, err) + return + } h, err := getHelmWithNoCluster()
39-57
: 在 AddOrUpdateRepo 方法中添加权限校验当前 pkg/controller/helm/helm_repo.go 的 AddOrUpdateRepo 无权限校验,与 helm_release.go 中对其他 Helm 操作均调用 handleCommonLogic 不一致,请在调用 getHelmWithNoCluster() 之前加入如下校验:
diff --git a/pkg/controller/helm/helm_repo.go b/pkg/controller/helm/helm_repo.go index abcdef1..1234567 100644 --- a/pkg/controller/helm/helm_repo.go +++ b/pkg/controller/helm/helm_repo.go @@ -39,6 +39,12 @@ func (r *HelmRepoController) AddOrUpdateRepo(c *gin.Context) { if err := c.ShouldBindJSON(&repo); err != nil { amis.WriteJsonError(c, err) return } + + // 权限校验:创建或更新 Helm 仓库 + _, _, err := handleCommonLogic(c, "create", repo.Name, "", "helm-repo") + if err != nil { + amis.WriteJsonError(c, err) + return + } h, err := getHelmWithNoCluster() if err != nil { amis.WriteJsonError(c, err) return }pkg/controller/helm/helm_chart.go (1)
37-56
: GetChartValue 方法缺少权限检查获取 Chart 值的操作应该有权限控制,确保只有授权用户才能访问。
建议添加权限检查:
func (hc *HelmChartController) GetChartValue(c *gin.Context) { repoName := c.Param("repo") chartName := c.Param("chart") version := c.Param("version") + + // 检查权限 + _, _, err := handleCommonLogic(c, "get", chartName, "", repoName) + if err != nil { + amis.WriteJsonError(c, err) + return + } + h, err := getHelmWithNoCluster()
🧹 Nitpick comments (5)
pkg/cb/cb.go (1)
70-73
: 可能存在命名空间重复的问题如果
ns
已经存在于nsList
中,这里的追加操作会导致重复。建议在追加前检查是否已存在。ns := stmt.Namespace if ns != "" { - nsList = append(nsList, ns) + if !slice.Contain(nsList, ns) { + nsList = append(nsList, ns) + } }pkg/comm/permission.go (2)
184-186
: 日志格式可能有误日志中
roleString=%v
但实际记录的是roles
,变量名不一致可能造成混淆。- klog.V(6).Infof("cb: cluster= %s,user= %s, role= %s,roleString=%v, operation=%s, resource=[%s/%s] ", - cluster, username, roleString, roles, action, ns, name) + klog.V(6).Infof("cb: cluster=%s, user=%s, platformRole=%s, clusterRoles=%v, operation=%s, resource=[%s/%s]", + cluster, username, roleString, roles, action, ns, name)
18-187
: 权限检查逻辑实现完善新的集中式权限检查函数很好地实现了:
- 平台管理员的特殊处理
- 基于角色的访问控制
- 命名空间白名单和黑名单机制
- 详细的错误信息
建议考虑将来进一步模块化,将不同 action 的处理逻辑抽取为独立函数以提高可维护性。
pkg/controller/helm/helm_release.go (2)
222-254
: 批量卸载操作可以优化在循环内创建 Helm 客户端(第 234 行)效率较低,建议在循环外创建一次。
func (hr *HelmReleaseController) BatchUninstallRelease(c *gin.Context) { var req struct { Names []string `json:"name_list"` Namespaces []string `json:"ns_list"` } if err := c.ShouldBindJSON(&req); err != nil { amis.WriteJsonError(c, err) return } + + h, err := getHelm(c) + if err != nil { + amis.WriteJsonError(c, err) + return + } + for i := 0; i < len(req.Names); i++ { name := req.Names[i] ns := req.Namespaces[i] - h, err := getHelm(c) - if err != nil { - amis.WriteJsonError(c, err) - return - } // 检查权限 _, _, err = handleCommonLogic(c, "delete", name, ns, "")
38-43
: 错误变量重复声明可能造成混淆多处使用
:=
重新声明err
变量,虽然语法正确,但可能影响代码可读性。考虑在需要时使用不同的变量名或显式赋值以提高代码清晰度。
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (10)
main.go
(3 hunks)pkg/cb/cb.go
(2 hunks)pkg/comm/permission.go
(1 hunks)pkg/controller/helm/helm.go
(3 hunks)pkg/controller/helm/helm_chart.go
(3 hunks)pkg/controller/helm/helm_release.go
(11 hunks)pkg/controller/helm/helm_repo.go
(5 hunks)pkg/helm/helm_cmd.go
(1 hunks)ui/public/pages/helm/chart.json
(3 hunks)ui/public/pages/helm/repo.json
(4 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (3)
main.go (3)
pkg/controller/helm/helm_release.go (1)
RegisterHelmReleaseRoutes
(18-30)pkg/controller/helm/helm_chart.go (1)
RegisterHelmChartRoutes
(16-22)pkg/controller/helm/helm_repo.go (1)
RegisterHelmRepoRoutes
(17-24)
pkg/comm/permission.go (5)
pkg/constants/role.go (4)
RolePlatformAdmin
(9-9)RoleClusterAdmin
(12-12)RoleClusterReadonly
(13-13)RoleClusterPodExec
(14-14)pkg/constants/jwt_user.go (1)
JwtUserName
(4-4)pkg/service/service.go (1)
UserService
(67-69)pkg/models/cluster_user_role.go (1)
ClusterUserRole
(15-25)pkg/comm/utils/slice.go (2)
AnyIn
(44-56)AllIn
(22-34)
pkg/controller/helm/helm_repo.go (1)
pkg/models/helm_repository.go (1)
HelmRepository
(11-30)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Analyze (go)
🔇 Additional comments (12)
pkg/helm/helm_cmd.go (1)
92-111
: 新增的无集群上下文构造函数实现良好这个新的构造函数
NewHelmCmdWithNoCluster
设计合理:
- 遵循了现有构造函数的模式
- 正确验证了
helmBin
参数- 确保缓存目录存在
- 适当地排除了集群相关配置,符合其设计目的
这个函数为需要在无集群上下文环境中使用 Helm 功能的场景提供了良好的支持。
ui/public/pages/helm/repo.json (1)
25-25
: API 端点更新与后端重构保持一致所有 Helm 仓库相关的 API 端点已正确更新到
/admin/helm/repo
命名空间:
- 保存仓库:
/admin/helm/repo/save
- 删除仓库:
/admin/helm/repo/delete/${ids}
- 更新索引:
/admin/helm/repo/update_index
- 列表查询:
/admin/helm/repo/list
这些更改与后端的路由重构完全一致,确保前端能够正确调用新的管理员权限 API。
Also applies to: 323-323, 330-330, 356-356, 374-374
main.go (3)
470-471
: Helm 发布路由注册重构良好将 Helm 发布相关的路由注册集中到
helm.RegisterHelmReleaseRoutes(api)
函数中,这是一个很好的重构:
- 提高了代码的组织性和可维护性
- 减少了 main.go 中的重复代码
- 遵循了单一职责原则
508-509
: Helm Chart 路由注册重构一致Chart 路由注册采用了与发布路由相同的集中化方法,通过
helm.RegisterHelmChartRoutes(mgm)
统一管理,保持了代码风格的一致性。
554-555
: Helm 仓库路由注册完成整体重构仓库路由注册通过
helm.RegisterHelmRepoRoutes(admin)
完成了整个 Helm 模块的路由重构,将所有 Helm 相关路由都采用了统一的注册方式。ui/public/pages/helm/chart.json (1)
95-95
: Chart API 端点更新与后端路由重构一致所有 Helm Chart 相关的 API 端点已正确更新到
/mgm/helm/
命名空间:
- Chart 列表:
/mgm/helm/chart/list
- Chart 版本列表:
/mgm/helm/repo/${repository_name}/chart/${name}/versions
- Chart 值配置:
/mgm/helm/repo/${repository_name}/chart/${name}/version/${install_version}/values
这些更改与后端控制器重构完全同步,确保前端能够正确调用新的管理组 API。
Also applies to: 142-142, 225-225
pkg/controller/helm/helm.go (3)
15-27
: 简化 getHelm 函数提高代码清晰度移除了
namespace
参数及其默认值逻辑,使函数职责更加单一明确。这个简化很好地反映了新的 Helm 客户端初始化方法。
28-32
: 新增无集群上下文函数支持更多场景
getHelmWithNoCluster
函数为不需要集群上下文的 Helm 操作提供了良好的支持,如仓库管理等场景。实现简洁且目的明确。
52-64
: 权限检查逻辑集中化改进将权限检查逻辑委托给新的
comm.CheckPermissionLogic
函数是一个很好的重构:
- 统一了权限验证逻辑
- 提高了代码的可维护性
- 移除了重复的权限检查代码
同时移除了日志记录前的延迟,提高了响应性能。
pkg/cb/cb.go (1)
65-76
: 权限检查逻辑集中化重构良好将权限检查逻辑从内联实现迁移到
comm.CheckPermissionLogic
是一个很好的架构改进,提高了代码的可维护性和一致性。pkg/controller/helm/helm_repo.go (1)
17-24
: 路由注册位置需要确认路由注册在
/admin
路径下,这通常表示管理员功能。请确认这是否符合设计意图,因为如果没有权限检查,任何能访问这些路由的用户都可以执行敏感操作。pkg/controller/helm/helm_release.go (1)
18-30
: Helm Release 控制器权限管理实现良好与其他 Helm 控制器相比,
HelmReleaseController
正确实现了所有方法的权限检查,这是很好的安全实践。
func RegisterHelmChartRoutes(mgm *gin.RouterGroup) { | ||
ctrl := &HelmChartController{} | ||
mgm.GET("/helm/repo/:repo/chart/:chart/versions", ctrl.ChartVersionOptionList) | ||
mgm.GET("/helm/repo/:repo/chart/:chart/version/:version/values", ctrl.GetChartValue) | ||
mgm.GET("/helm/chart/list", ctrl.ListChart) | ||
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Helm Chart 控制器权限管理不一致
与 HelmReleaseController
相比,HelmChartController
完全没有权限检查,这种不一致性可能导致安全漏洞。建议统一所有 Helm 相关控制器的权限管理策略。
🤖 Prompt for AI Agents
In pkg/controller/helm/helm_chart.go around lines 16 to 22, the
RegisterHelmChartRoutes function registers routes for HelmChartController
without any permission checks, unlike HelmReleaseController which has
authorization. To fix this, add appropriate middleware or permission checks to
these routes to enforce consistent access control across all Helm-related
controllers, ensuring security policies are uniformly applied.
将helm纳入统一的权限管理