拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Harbor 项目创建权限管控:从配置文件到 API 校验的完整实践

Harbor 项目创建权限管控从配置文件到 API 校验的完整实践【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harbor导读Harbor 作为开源的云原生制品仓库其「项目创建权限」Project Creation Restriction开关决定了普通用户能否自助创建项目。本文以 Harbor 官方测试用例 tests/testcases/Group8-Configuration/8-02-Authentication-edit-project-creation-restriction.md 为主线完整还原管理员修改项目创建限制 → 普通用户创建项目被拒的验证流程并结合仓库源码配置元数据、参数校验、API 权限拦截讲解该功能的底层实现。读完本文你将掌握该开关的两种取值、配置入口、默认行为、后端校验逻辑以及自动化回归验证方法。一、测试用例背景验证什么该测试用例属于Group8-Configuration配置类测试组其标题为Test 8-02 - Update-project-restrict核心目的Purpose是To verify that an admin user can update project restrict. 验证管理员用户能够更新「项目创建限制」配置。这是一个黑盒功能验证用例覆盖的操作链路为管理员在 UI 配置页将项目创建限制从everyone改为admin only登出管理员使用非管理员账号登录尝试新建项目断言非管理员看不到新建项目按钮即创建入口被隐藏后端同时返回 403。从源码角度这一系列行为背后对应的是 Harbor 的全局配置项project_creation_restriction它由系统级配置框架统一管理并最终在项目创建 API 处强制执行。二、核心配置项project_creation_restriction2.1 两种取值与默认值在 src/common/const.go 中定义了该配置项仅有的两种合法取值常量取值含义ProCrtRestrEveryoneeveryone任何已登录用户含普通用户均可创建项目默认值ProCrtRestrAdmOnlyadminonly仅系统管理员可创建项目配置项的元数据定义在 src/lib/config/metadata/metadatalist.go{Name: common.ProjectCreationRestriction, Scope: UserScope, Group: BasicGroup, EnvKey: PROJECT_CREATION_RESTRICTION, DefaultValue: common.ProCrtRestrEveryone, // 默认 everyone ItemType: ProjectCreationRestrictionType{}, Editable: false, Description: Indicate who can create projects, it could be adminonly or everyone.},要点说明默认值为everyone即默认情况下普通用户登录后即可自助创建项目该项属于UserScope用户级配置而非部署期 system 级配置意味着它不通过harbor.yml或环境变量在部署时固定而是运行时通过 UI / API 修改并持久化到数据库Editable: false表示该配置项不能通过 API 随意修改仅能由管理员通过 UI 或在部署配置中设置见下文 API 说明。2.2 取值合法性校验配置值的合法性由 src/lib/config/metadata/type.go 中的ProjectCreationRestrictionType.validate保证func (t *ProjectCreationRestrictionType) validate(str string) error { if !(str common.ProCrtRestrAdmOnly || str common.ProCrtRestrEveryone) { return fmt.Errorf(invalid %s, should be %s or %s, common.ProjectCreationRestriction, common.ProCrtRestrAdmOnly, common.ProCrtRestrEveryone) } return nil }即配置值只接受adminonly或everyone二选一写入其他值会被配置管理器直接拒绝。这也解释了为什么测试用例与 API 测试中始终使用这两个精确字符串。2.3 读取逻辑src/lib/config/userconfig.go 提供了业务侧读取入口// OnlyAdminCreateProject returns the flag to restrict that only sys admin can create project func OnlyAdminCreateProject(ctx context.Context) (bool, error) { err : DefaultMgr().Load(ctx) if err ! nil { return true, err } return DefaultMgr().Get(ctx, common.ProjectCreationRestriction).GetString() common.ProCrtRestrAdmOnly, nil }每次调用先从配置管理器Load最新配置支持内存 / DB / REST 等多种配置驱动见 src/common/const.go 中DBCfgManager、InMemoryCfgManager、RestCfgManager返回值true表示仅管理员可创建项目加载失败时出于安全考虑默认返回 true收紧权限避免配置异常导致权限失控。三、后端强制校验CreateProject API 的权限拦截测试用例期望非管理员无法创建项目这一约束不仅仅依赖 UI 隐藏按钮还在服务端强制实施。项目创建入口在 src/server/v2.0/handler/project.go 的CreateProject中完成两层拦截func (a *projectAPI) CreateProject(ctx context.Context, params operation.CreateProjectParams) middleware.Responder { if err : a.RequireAuthenticated(ctx); err ! nil { return a.SendError(ctx, err) } onlyAdmin, err : config.OnlyAdminCreateProject(ctx) if err ! nil { return a.SendError(ctx, fmt.Errorf(failed to determine whether only admin can create projects: %v, err)) } secCtx, _ : security.FromContext(ctx) if r, ok : secCtx.(*robotSec.SecurityContext); ok !r.User().IsSysLevel() { log.Errorf(Only system level robot can create project) return a.SendError(ctx, errors.ForbiddenError(nil).WithMessage(Only system level robot can create project)) } if onlyAdmin !(a.isSysAdmin(ctx, rbac.ActionCreate) || secCtx.IsSolutionUser()) { log.Errorf(Only sys admin can create project) return a.SendError(ctx, errors.ForbiddenError(nil).WithMessage(Only system admin can create project)) } ... }拦截流程可概括为认证RequireAuthenticated确保请求来自已登录用户读取全局配置调用config.OnlyAdminCreateProject(ctx)判断当前是否为仅管理员可建项目模式Robot 账号限制非系统级的 robot 账号一律禁止创建项目返回Only system level robot can create project管理员校验当onlyAdmin true且当前用户既不是系统管理员、也不是 Solution User 时返回403 Forbidden错误信息为Only system admin can create project—— 这正是 API 自动化测试断言的服务端错误体。也就是说即使绕过 UI 直接调用 REST API普通用户也无法创建项目权限边界在服务端是闭环的。四、UI 侧表现普通用户看不到新建项目按钮测试用例的期望结果是In step5, non-admin user will not see the add project button.Harbor 前端根据系统配置动态渲染项目列表页。相关逻辑位于 src/portal/src/app/base/left-side-nav/projects/list-project/list-project.component.ts它读取系统配置中的project_creation_restriction当其值为adminonly时仅向系统管理员展示新建项目入口普通用户的项目列表页则不渲染该按钮。配置的获取与传递在 src/portal/src/app/services/app-config.ts 与 src/portal/src/app/base/left-side-nav/config/config.ts 中定义与后端返回的配置项一一对应。因此该功能存在双重防线UI 层面隐藏入口提升体验服务端 API 层面强制拒绝保证安全。五、管理员修改配置的两种途径5.1 通过 UI 配置页管理员登录后进入配置管理Administration→ 系统设置 / Configuration页面找到「项目创建限制」Project Creation Restriction项在Everyone与Admin Only之间切换并保存。该页面由 src/portal/src/app/base/left-side-nav/config/system/system-settings.component.ts 实现其中project_creation_restriction是其处理的配置属性之一。5.2 通过 REST API自动化测试使用 Harbor 的 v2.0 配置 API 完成切换。API 客户端封装见 tests/apitests/python/library/configurations.pydef set_configurations_of_project_creation_restriction(self, project_creation_restriction, expect_status_code 200, **kwargs): client self._get_client(**kwargs) configdict(project_creation_restrictionproject_creation_restriction) set_configurations(client, expect_status_code expect_status_code, **config)对应的 REST 调用为PUT /api/v2.0/configurations请求体示例{ project_creation_restriction: adminonly }读取配置则使用GET /api/v2.0/configurations返回体中的project_creation_restriction.value即为当前取值见get_configurations实现。注意普通用户无权调用配置 API该接口仅系统管理员可访问这也是测试中必须先用ADMIN_CLIENT修改配置的原因。部署层面的补充虽然该项为运行时配置但 Harbor 也提供了PROJECT_CREATION_RESTRICTION环境变量作为初始化值见元数据EnvKey可在首次部署时由harbor.yml/ 环境注入随后可在 UI 中再调整。六、完整的端到端回归验证6.1 UI 手工验证步骤对应原测试用例前置环境一个运行中的 Harbor 实例一台装有 Docker CLIDocker 客户端的 Linux 主机拥有系统管理员账号与一个普通用户账号。执行步骤以管理员身份登录 Harbor UI进入配置管理 → 系统设置将「项目创建限制」从Everyone改为Admin Only并保存登出管理员账号以普通用户身份登录尝试新建项目。预期结果步骤 5 中普通用户页面不会出现新建项目按钮即使手工构造 API 请求也会收到403 Forbidden错误体为Only system admin can create project。6.2 API 自动化测试test_edit_project_creation.py仓库中已提供与手工用例等价的 Python 自动化用例 tests/apitests/python/test_edit_project_creation.py其核心步骤与 tests/apitests/python/library/project.py 的项目封装配合使用管理员创建一个新用户密码Aa123456以管理员身份调用配置 API将project_creation_restriction设为adminonly用新用户调用创建项目 API断言返回 403并精确校验响应体self.project.create_project( metadata {public: false}, expect_status_code 403, expect_response_body {\errors\:[{\code\:\FORBIDDEN\,\message\:\Only system admin can create project\}]}, **TestProjects.USER_edit_project_creation_CLIENT)以管理员身份将配置改回everyone再次用新用户创建项目断言创建成功得到项目 ID清理删除项目与用户tearDown。该用例形成完整的限制开启 → 拒绝 → 限制关闭 → 放行闭环既能验证配置写入/读取的正确性也能验证后端权限拦截的准确性可作为 CI 中配置类回归测试的参考模板相关 CI 运行入口见 tests/ci/api_run.sh。七、常见问题与注意事项现象 / 疑问说明修改后普通用户仍显示新建项目按钮检查配置是否保存成功、浏览器缓存或通过GET /api/v2.0/configurations确认真实值直接调用 API 创建项目返回 403属预期行为adminonly模式下服务端强制拦截src/server/v2.0/handler/project.gorobot 账号创建项目被拒非系统级 robot 一律禁止创建项目与project_creation_restriction无关见同文件 L114-L117配置值写不进去该配置项仅接受everyone/adminonly其他值会被元数据校验拒绝src/lib/config/metadata/type.go配置管理器加载失败OnlyAdminCreateProject出于安全默认返回true收紧为仅管理员避免误放行src/lib/config/userconfig.go八、总结project_creation_restriction是 Harbor 多租户权限模型中一个简单但关键的系统配置配置层取值限定everyone默认/adminonly由元数据框架统一管理、校验与持久化src/lib/config/metadata/metadatalist.go服务端项目创建 API 通过OnlyAdminCreateProject读取配置并强制拦截非管理员请求src/server/v2.0/handler/project.go客户端UI 根据配置动态隐藏/显示新建项目入口验证既有 UI 手工用例 8-02-Authentication-edit-project-creation-restriction.md也有等价的 API 自动化用例 test_edit_project_creation.py 可长期回归。对于多团队共享的 Harbor 实例建议在生产环境将该项设为adminonly由管理员统一审批项目创建从而避免命名空间混乱与资源滥用在开发/测试环境可保持默认的everyone以降低协作门槛。【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harbor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门