
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),僅供參考