)
Harbor 本地数据库认证模式下管理员账户设置更新的验证与实现解析Test 1-10【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harbor本篇指南围绕 Harbor 开源仓库中的用户管理测试用例 1-10-admin-update-account-settings.md 展开深入讲解在db_auth本地数据库认证模式下管理员如何通过 Web UI 修改自己的账户设置邮箱、全名与备注并验证修改后使用新邮箱重新登录依然有效的完整流程。读完本文你将掌握该测试用例的环境搭建前提、逐步骤操作与预期判定标准同时理解账户设置修改在前端组件、REST API 处理器、用户控制器与数据访问层之间的完整调用链以及字段校验规则与多认证模式下的权限差异。一、测试用例定位与适用场景Test 1-10 属于 Harbor 仓库 tests/testcases/Group1-user-management 用户管理测试组其验证目标是确认管理员用户可以更新自己的账户设置Account Settings。该用例与同组的 1-04-DB-user-update-account-settings.md普通用户更新账户设置、1-11-admin-update-password.md管理员修改密码等用例相互补充共同覆盖本地数据库认证模式下用户自助管理能力的核心路径。环境前提Environment依据测试用例文档执行该用例需要满足以下条件Harbor 实例已启动并可用能够通过浏览器访问 Web UI。Harbor 配置为本地数据库认证即认证模式auth_mode设置为db_auth。该取值在源码 src/common/const.go 中定义为常量DBAuth db_auth。此模式下用户数据用户名、邮箱、密码等存储在 Harbor 自身的本地数据库中。一台安装了 Docker CLIDocker 客户端的 Linux 主机用于验证镜像推送等配套场景本用例本身仅依赖 Web UI 操作Docker CLI 是测试组环境的通用要求。二、验证步骤详解Test Steps测试用例定义了四个核心步骤下面逐条展开说明其操作路径与背后含义。Step 1管理员登录 Web UI使用管理员账号默认用户名admin用户 ID 为 1登录 Harbor Web 门户。在db_auth模式下登录认证由MatchLocalPassword完成它会根据输入的用户名或邮箱去匹配用户表记录并对密码进行加密比对详见 src/pkg/user/manager.go。这意味着用户名或邮箱 密码均可作为登录凭据这正是 Step 4 中使用新邮箱登录能够成立的底层原因。Step 2修改账户设置邮箱、全名与备注在门户右上角打开**账户设置Account Settings**弹窗依次修改Email邮箱Full name全名Comments备注修改完成后点击保存。这一步在 UI 层由 account-settings-modal.component.ts 驱动submit()方法会先校验表单合法性再调用SessionService.updateAccountSettings()最终通过PUT /users/{id}接口把修改后的账户对象提交到后端参见 session.service.ts。Step 3退出登录保存成功后登出系统清空当前会话。Step 4使用新邮箱重新登录并核对设置管理员使用修改后的新邮箱作为登录名再次登录。登录成功后进入账户设置页面确认邮箱、全名与备注与 Step 2 中输入的内容完全一致且登录凭据新邮箱已被系统接受。三、预期结果与判定标准Expected Outcome用例给出了两条明确的通过标准Step 2 中账户设置可以被成功修改修改过程不报错保存后后端持久化成功Step 4 中用户可以使用新邮箱登录且登录后查看到的账户设置与 Step 2 中输入的内容一致。这两条标准分别验证了写入路径更新账户信息落库与读取/认证路径以邮箱作为登录标识进行认证并返回最新资料的正确性构成一个完整的闭环回归验证。四、后端实现原理从 API 到数据库的完整调用链账户设置的更新并不是一次简单的数据库写入它经过严格的分层校验。下面按调用顺序梳理源码实现。4.1 API 处理器层参数接收与权限校验REST 接口PUT /users/{user_id}的处理器是 src/server/v2.0/handler/user.go 中的UpdateUserProfile。其处理流程为调用requireModifiable(ctx, uid)进行权限校验从请求体中取出Realname、Email、Comment三个字段构造commonmodels.User调用validateUserProfile(m, false)做字段合法性校验调用user.Ctl.UpdateProfile(ctx, m)真正落库。权限校验requireModifiableuser.go的实现体现了认证模式差异在db_auth模式下管理员可以更新任意用户的资料走系统级rbac.ActionUpdateResourceUser权限检查普通用户只能更新自己的资料通过matchUserID判断会话用户与目标用户 ID 是否一致在非本地数据库认证模式如 LDAP、OIDC下出于外部身份源数据一致性的考虑只有本地内置管理员ID 为 1可以被更新其余用户的资料一律禁止修改并返回 403。这也解释了为什么该用例明确限定在db_auth模式下执行——在其他认证模式下修改账户设置的能力范围会大幅收窄。字段校验validateUserProfileuser.go的规则如下表字段校验规则不通过时的报错信息email非空且匹配标准邮箱格式正则email cant be empty/email with illegal formatrealname长度 1~255且不含用户名非法字符realname with illegal length/realname contains illegal characterscomment长度上限 30允许为空-1表示无下限comment with illegal lengthusername仅在创建用户createtrue时校验长度与非法字符—注意更新场景下username为空字符串因此校验函数会跳过用户名检查源码注释明确说明skip to validate username for update because username is empty in the request即用户名不可通过账户设置接口修改它与邮箱、全名、备注是相互独立的更新维度。4.2 控制器层UpdateProfilesrc/controller/user/controller.go 中的UpdateProfile是对用户管理器的薄封装直接透传给mgr.UpdateProfile(ctx, u, cols...)。控制器接口controller.go的注释明确说明UpdateProfile只更新模型中的部分属性子集具体由 manager 的实现决定。4.3 管理器层默认更新列关键实现位于 src/pkg/user/manager.gofunc (m *manager) UpdateProfile(ctx context.Context, user *commonmodels.User, cols ...string) error { if len(cols) 0 { cols []string{Email, Realname, Comment} } return m.dao.Update(ctx, user, cols...) }当调用方未显式指定更新列时默认只会更新Email、Realname、Comment三个字段。这与测试用例 Step 2 中修改邮箱、全名和备注的操作完全对应密码password/salt/password_version与系统管理员标志sysadmin_flag等敏感字段不会被本次更新波及分别由独立的UpdatePassword与SetSysAdminFlag方法负责。4.4 数据访问层用户表的列定义与更新DAO 层的用户结构体定义在 src/pkg/user/dao/user.go对应数据库harbor_user表关键字段包括user_id主键、username、email、password、password_version、realname、comment、deleted、sysadmin_flag、salt、creation_time、update_time。其中email列被定义为sql.NullString注释说明这是因为 LDAP/OIDC 认证下邮箱可能缺失设置为 NULL 可避免唯一约束检查失败dao/user.go——这是外部认证用户没有邮箱也能入库的实现细节。dao.Updatesrc/pkg/user/dao/dao.go调用 ORM 的ormer.Update(toDBUser(user), props...)按指定列执行更新若影响行数为 0 则返回user with id %d not found错误。4.5 登录认证邮箱与用户名等价匹配Step 4使用新邮箱登录得以成功依赖登录认证支持用户名或邮箱两种凭据。MatchLocalPassword使用关键字username_or_email查询用户列表而 DAO 的 FilterByUsernameOrEmail 会生成Username ? OR Email ?的查询条件。密码比对则通过utils.Encrypt(password, entry.Salt, entry.PasswordVersion)完成比对成功后返回用户记录密码字段被清空供后续会话使用。五、前端交互细节账户设置弹窗Harbor 门户Angular 前端的账户设置弹窗由 account-settings-modal.component.ts 实现其交互逻辑与测试用例步骤一一对应初始化快照open()方法会深拷贝当前会话用户作为originalStaticData用于后续比对表单是否发生变化component.ts邮箱唯一性预检当邮箱被修改时前端会先调用checkUserExisting(email, ...)向后端查询该邮箱是否已被占用避免提交后因唯一约束报错component.ts提交与刷新submit()通过SessionService.updateAccountSettings()发起PUT请求成功后重新拉取当前用户信息刷新页面数据component.ts内置管理员重命名当会话用户是adminuser_id 1且具有系统管理员角色时弹窗还会展示重命名能力将用户名从admin改为adminharbor.local但这属于独立于本用例的附加功能。六、边界情况与注意事项认证模式强约束本用例仅适用于db_auth。在 LDAP/OIDC 模式下requireModifiable只允许更新内置管理员ID1的资料其余外部认证用户无法通过该接口修改账户设置。更新范围有限账户设置接口默认只更新邮箱、全名、备注三个字段密码修改走独立接口PUT /users/{id}/password参见 1-11-admin-update-password.md并且新密码需满足8~128 位且同时包含大写字母、小写字母和数字的强度要求requireValidSecret见 user.go。邮箱唯一性与格式后端会校验邮箱格式正则与必填性前端亦会做占用预检重名邮箱会被拒绝。可能的故障Possible Problems原始测试用例标注为None即该路径在db_auth模式下未记录已知的常见故障场景若实际执行中遇到问题可优先检查 Harbor 实例日志与auth_mode配置是否为db_auth。七、相关资源索引测试用例原文tests/testcases/Group1-user-management/1-10-admin-update-account-settings.md同组对比用例1-04-DB-user-update-account-settings.md、1-11-admin-update-password.mdAPI 处理器与校验逻辑src/server/v2.0/handler/user.go用户控制器src/controller/user/controller.go用户管理器默认更新列src/pkg/user/manager.go用户 DAO 与表结构src/pkg/user/dao/user.go、src/pkg/user/dao/dao.go用户模型定义src/common/models/user.go前端账户设置弹窗src/portal/src/app/base/account-settings/account-settings-modal.component.ts认证模式常量src/common/const.go【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harbor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考