尧图精选

Harbor LDAP 用户组删除全流程解析:从 UI 操作、REST API 到级联清理源码验证

🕒 发布时间:2026/9/11 16:41:07 📁 来源:尧图网络
Harbor LDAP 用户组删除全流程解析从 UI 操作、REST API 到级联清理源码验证【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harborHarbor 作为云原生镜像仓库支持将外部 LDAP/AD 目录中的用户组映射为 Harbor 内的用户组并据此向项目批量授权。本文以仓库内测试用例 12-03-LDAP-usergroup-delete.md 为骨架系统讲解删除 LDAP 用户组的完整链路前置环境要求、四项 LDAP 组配置参数的含义、UI 与 REST API 两种操作方式以及删除用户组后其项目成员关系同步清除这一行为背后的源码实现。读完本文你将掌握 LDAP 用户组从创建、授权到删除的全生命周期操作与验证方法并能依据源码定位删除逻辑的落点。一、测试用例背景与验证目标测试用例 12-03 归属于tests/testcases/Group12-group-management/组管理测试组其核心验证目标非常明确验证管理员用户能够删除一个 LDAP 用户组admin user can delete an LDAP group并且删除后该组在项目中的全部成员角色信息一并被移除。这实际上覆盖了 Harbor 用户组生命周期中最容易被忽略的一个行为用户组被删除时其与项目成员表project_member中的关联记录必须同步清理否则会出现孤儿授权记录导致 LDAP 目录中已不存在的组仍然保留项目权限。下文将围绕这一目标逐步展开。二、环境前置条件测试与生产使用前需要满足以下环境要求条件说明Harbor 实例一个正在运行且可访问的 Harbor 实例认证模式需配置为 LDAP 认证否则用户组页面无法以 LDAP 组类型添加组LDAP 服务器一个正在运行、可访问的 LDAP 目录服务器且启用了 memberof overlay成员归属覆盖功能LDAP 组配置参数在 Harbor 的系统配置中正确填写 ldap_group_basedn、ldap_group_filter、ldap_gid、ldap_group_scope 四项参数其中memberof overlay是 OpenLDAP 提供的一种 overlay覆盖机制它维护组条目与用户条目之间的反向成员关系使 Harbor 在验证 LDAP 用户所属组时能够高效、准确地检索出该用户加入的所有组。它是 LDAP 用户组功能正常工作的前提之一。2.1 四项 LDAP 组配置参数详解测试用例明确指出需要配置以下参数。它们在 Harbor 配置模型中对应 src/lib/config/models/model.go 的GroupConf结构体字段测试文档参数对应源码字段JSON 键含义与建议值ldap_group_basednBaseDNldap_group_base_dnLDAP 组搜索的基准 DN例如ougroups,dcexample,dccomHarbor 将在此子树内查找组条目ldap_group_filterFilterldap_group_filter过滤组条目的 LDAP 过滤器例如(objectClassposixGroup)源码 filter.go 中的normalizeFilter会自动为不带括号的过滤器补全()包裹ldap_gid组唯一 ID 属性指定标识组唯一 ID 的属性名Harbor 用它区分不同的组条目不同版本/认证源下该属性名称可能为gidNumber等需与 LDAP 目录 schema 对应ldap_group_scopeSearchScopeldap_group_search_scope组搜索的深度典型取值为 0Base仅基准 DN 本身、1OneLevel基准 DN 下一层、2Subtree基准 DN 下全部子树此外GroupConf还包含ldap_group_name_attribute组名属性用于在 Harbor UI 中显示组名与ldap_group_admin_dn、ldap_group_membership_attribute等字段可结合你的目录 schema 一并配置。需要说明的是上述过滤器在 src/pkg/ldap/filter.go 中由NewFilterBuilder解析为 BER 包结构并支持And/Or组合构建说明 Harbor 的组过滤是标准的 LDAP 过滤语义任何符合 RFC 4515 的过滤器均可使用。三、操作步骤详解创建、授权、删除与验证测试用例给出了 5 个操作步骤下面逐一对每步进行展开并同步给出对应的 REST API 行为对应 src/server/v2.0/handler/usergroup.go。步骤 1以管理员身份登录 Harbor UI使用具有系统管理员权限的账号admin登录 Harbor Web 控制台。删除用户组属于系统级管理操作需要系统管理员权限。步骤 2在Administration - User Group页面添加 LDAP 用户组进入「管理 - 用户组」页面点击「新建用户组」选择类型为LDAP填写有效的组 DN例如cndevelopers,ougroups,dcexample,dccom及组名。创建动作对应的底层逻辑在 src/controller/usergroup/controller.go 的Create方法中其校验顺序值得注意当GroupType为 LDAP 组类型时先调用auth.SearchGroup到 LDAP 目录中校验该 DN 是否真实存在若目录中不存在该 DN返回ldap.ErrNotFoundHarbor 会拒绝创建并提示LDAP Group DN is not found: DN:xxx若 DN 语法非法返回ldap.ErrDNSyntax提示invalid DN syntax若 Harbor 内已存在同名同类型的用户组返回冲突错误duplicate user group, group name:xxx, group type:xxx, ldap group DN:xxx。也就是说只有 LDAP 目录中真实存在的组才能被添加到 Harbor这从源头保证了组数据的有效性。对应的 API 为POST /usergroupsCreateUserGroup同样要求RequireSystemAccess(ctx, rbac.ActionCreate, rbac.ResourceUserGroup)。步骤 3在 library 项目中为该用户组分配 developer 角色进入「项目 - library - 成员」页面点击「添加用户组」搜索并选择刚创建的 LDAP 用户组赋予developer开发者角色。此时project_member表中会生成一条entity_typegg 即 group的记录将该组与 library 项目绑定。步骤 4在Administration - User Group页面删除该用户组回到「管理 - 用户组」页面对目标 LDAP 用户组执行删除操作。删除动作对应的 API 为DELETE /usergroups/{group_id}DeleteUserGroup见 usergroup.go其要点要求RequireSystemAccess(ctx, rbac.ActionDelete, rbac.ResourceUserGroup)即仅有系统管理员可删除用户组当groupID 0时直接返回 400 Bad Requestthe group id should be provided删除成功返回 200 OK。步骤 5回到 library 项目成员页验证组角色已被移除刷新 library 项目的成员列表确认该 LDAP 用户组已不再出现在成员列表中即该组原先的 developer 角色授权已被清除。四、级联清理行为的源码级验证测试用例的「Expected Outcome」明确要求删除用户组时其全部项目成员信息必须一并移除。这一行为并非仅靠 UI 约束而是由数据访问层显式实现。删除调用链为DELETE /usergroups/{id} → userGroupAPI.DeleteUserGroup src/server/v2.0/handler/usergroup.go → usergroup.Controller.Delete src/controller/usergroup/controller.go → usergroup.Manager.Delete src/pkg/usergroup/manager.go → dao.Delete src/pkg/usergroup/dao/dao.go关键逻辑在 src/pkg/usergroup/dao/dao.go 的Delete方法中func (d *dao) Delete(ctx context.Context, id int) error { userGroup : model.UserGroup{ID: id} o, err : orm.FromContext(ctx) if err ! nil { return err } _, err o.Delete(userGroup) if err nil { // Delete all related project members sql : delete from project_member where entity_id ? and entity_typeg _, err : o.Raw(sql, id).Exec() if err ! nil { return err } } return err }从源码可以看出两点先删除用户组主记录o.Delete(userGroup)删除user_group表中对应 ID 的记录再级联清理项目成员关联随后执行delete from project_member where entity_id ? and entity_typeg即把project_member表中所有entity_id等于该组 ID、且entity_typeg的记录一并删除。entity_typeg正是该成员记录属于用户组的判别标识——这与步骤 3 中创建组授权时写入的记录类型完全对应。因此删除用户组后任何项目包括 library中该组的所有角色授权都会被同步移除不存在残留权限。这就是测试用例预期结果的直接实现依据。五、预期结果与验证要点按照上述步骤执行后需要确认以下结果步骤 4 中用户组被成功删除Administration - User Group页面不再显示该组所有项目成员信息被移除library 项目以及其他曾授权该组的项目的成员列表中该组的角色记录消失无残留LDAP 目录本身不受影响删除操作只删除 Harbor 内部的用户组映射与授权记录不会对 LDAP 服务器中的组条目做任何修改——Harbor 只消费 LDAP 目录数据不反向写回。六、相关实现与测试导航若希望进一步深入可以继续阅读以下仓库内容配置模型LDAP 认证与组配置结构体定义见 src/lib/config/models/model.goLDAP 交互层Ping、SearchUser、ImportUser、SearchGroup等能力见 src/pkg/ldap/manager.go其中SearchGroup支持按组名或组 DN 两种检索方式并会对 DN 做语法解析校验用户组控制器Create/Delete/Update/Get/List的完整接口与错误语义见 src/controller/usergroup/controller.goREST API Handler用户组相关接口创建、删除、查询、搜索见 src/server/v2.0/handler/usergroup.go其中ListUserGroups会根据当前认证模式LDAP/HTTP自动过滤对应类型的用户组用户组 Manager 与 DAOOnboard、Delete、ReadOrCreate等见 src/pkg/usergroup/manager.go 与 src/pkg/usergroup/dao/dao.go单元测试用户组控制器的测试覆盖见 src/controller/usergroup/test/controller_test.go。七、小结LDAP 用户组删除看似是 UI 上的一个普通操作实则涉及LDAP 目录校验 - Harbor 组记录删除 - 项目成员关系级联清理三个层面。通过测试用例 12-03 与源码的对照可以确认Harbor 在删除用户组时会通过 DAO 层的显式 SQL 同步清除project_member中entity_typeg的全部关联记录从而保证删除后项目授权信息彻底、干净地移除。在实际运维中建议将「删除用户组」与「重新查看受影响项目的成员列表」作为一组标准操作流程确保权限收敛无残留。【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harbor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →