尧图精选

Nacos Auth API 集成测试场景覆盖指南:从 v1/v3 登录到可见性授权

🕒 发布时间:2026/9/10 4:27:10 📁 来源:尧图网络
Nacos Auth API 集成测试场景覆盖指南从 v1/v3 登录到可见性授权【免费下载链接】nacosan easy-to-use dynamic service discovery, configuration and service management platform for building AI cloud native applications.项目地址: https://gitcode.com/GitHub_Trending/na/nacosNacos 在test/openapi-test模块中为认证Auth插件 API 建立了独立的 standalone-server 集成测试IT场景清单本文以 AUTH_API_TEST_SCENARIOS.md 为核心脉络逐项讲解用户登录v1/v3、角色、权限、可见性授权四类 API 的测试覆盖现状、接口行为约定与底层源码实现。读完本文你将掌握如何对照状态图例Covered / Partial / Pending评估认证 API 的测试完备性理解 v1/v3 登录的扁平 Token 响应契约与失败响应收敛策略并了解可见性授权 API 的参数归一化与错误码约定。一、测试场景覆盖模型API Scenario Coverage该文档定义了一套分支级branch-level覆盖目标它并不追求逐行代码覆盖而是聚焦API 场景覆盖三个维度期望能力expected capability接口在正常输入下是否返回符合契约的结果边界/校验行为boundary/validation behavior空参数、非法参数等边界输入是否被正确拒绝受控异常/错误处理controlled exception/error handling异常场景是否返回约定的状态码与错误体而不是 500 或不可预期的内部错误。所有 API 场景按以下状态图例归类状态含义Covered当前 IT 已验证预期行为及其重要的结果形态Partial当前 IT 已验证代表性行为但仍有重要的公开 API 场景未覆盖Pending当前没有任何 IT 验证该公开 API 场景这些 IT 类位于test/openapi-test/src/test/java/com/alibaba/nacos/test/adminapi/auth目录下。当前仓库中实际存在的两个 IT 类分别是UserLoginAuthApiITCase.java覆盖 v1/v3 登录 APIVisibilityGrantAuthApiITCase.java覆盖可见性授权 API。二、登录 API 场景v1 与 v3 的兼容性契约2.1 接口面与覆盖状态API 面 / IT 类覆盖的 API 操作当前状态当前/缺失覆盖UserLoginAuthApiITCasePOST /v3/auth/user/loginPOST /v1/auth/users/loginPartial已验证 v1/v3 的扁平 Token 成功响应、空密码拒绝、未知用户与错误密码返回一致的 HTTP 403 与通用响应体管理员引导bootstrap、用户 CRUD、密码更新、搜索/列表行为仍未覆盖从实现上看v1 与 v3 的登录入口由两个 Controller 分别承载v1UserController.java 通过RequestMapping({/v1/auth, /v1/auth/users})挂载PostMapping(/login)上标注了Compatibility(apiType ApiType.OPEN_API, alternatives POST ${contextPath:nacos}/v3/auth/user/login)即 v1 登录接口为兼容旧客户端而保留官方推荐迁移到 v3 路径v3UserControllerV3.java 的login方法同样要求username与password两个表单参数。2.2 扁平 Token 成功响应flat token responseIT 中assertFlatTokenResponse见 UserLoginAuthApiITCase.java明确校验了登录成功响应体顶层不包含code包装字段assertFalse(root.has(code))必须包含非空的accessTokentokenTtl必须大于 0globalAdmin为布尔值username与登录用户名一致。这正是默认认证插件的扁平 Token 对象约定。在 default-auth-plugin-spec.md 中有明确说明/v3/auth/user/login与旧版 v1 登录路由的成功响应不会包在ResultT中而是直接返回包含accessToken、tokenTtl、globalAdmin、username的扁平对象。其底层实现在 UserControllerV3.java登录成功后一方面把Bearer token写入响应头Authorization另一方面以Map形式返回四个字段response.addHeader(AuthConstants.AUTHORIZATION_HEADER, AuthConstants.TOKEN_PREFIX user.getToken()); MapString, Object result new HashMap(); result.put(Constants.ACCESS_TOKEN, user.getToken()); result.put(Constants.TOKEN_TTL, jwtTokenManager.getTokenTtlInSeconds(user.getToken())); result.put(Constants.GLOBAL_ADMIN, iAuthenticationManager.hasGlobalAdminRole(user)); result.put(Constants.USERNAME, user.getUserName()); return result;其中TOKEN_PREFIX为Bearer GLOBAL_ADMIN_ROLE为ROLE_ADMIN默认 Token 过期时间为18000秒见 AuthConstants.java。tokenTtl由TokenManagerDelegate.getTokenTtlInSeconds动态计算因此测试断言其大于 0而非固定值以兼容不同过期时间配置。2.3 失败响应收敛未知用户、错误密码、空密码三者一致文档强调的核心场景是防止用户名枚举未知用户与已知用户错误密码必须返回完全相同的 HTTP 状态与响应体。IT 中的verifyLoginFailureResponses与assertLoginFailureUserLoginAuthApiITCase.java验证了assertEquals(403, response.code(), response.body()); assertEquals(LOGIN_FAILURE_MESSAGE, response.body());即三种失败输入wrong-password、unknown user、blank password统一返回HTTP 状态码403 Forbidden响应体User not found! Please check user exist or password is right!同时测试还断言assertEquals(wrongPassword, unknownUser)与assertEquals(wrongPassword, blankPassword)确保三者响应完全一致。该消息字符串定义在 AuthConstants.java 的INVALID_CREDENTIALS_MESSAGE并在 v1/v3 两个 Controller 的认证失败分支中被统一返回见 UserControllerV3.java。值得注意的边界行为空密码也被同样拒绝而不是由参数校验层返回 400这说明登录接口刻意将凭据不合法的所有情况收敛为同一种认证失败语义避免泄露任何关于用户是否存在的信息。2.4 测试中的时序处理等待登录最终一致IT 中waitForLoginSuccessUserLoginAuthApiITCase.java对 v3 登录采用最多 20 次、每次间隔 1 秒的轮询新建用户后立即登录若响应为 200 则直接返回否则等待重试。这是因为 standalone-server 环境下用户创建POST /v3/auth/user与登录认证之间可能存在短暂的读写一致窗口轮询能避免偶发性失败导致的测试不稳定。三、用户管理 API 面测试未覆盖但实现完整文档将用户 CRUD 列为登录 IT 的缺失覆盖项。对照源码v3 用户管理接口在 UserControllerV3.java 中已完整实现且均标注Since(3.0.0)与Secured(..., apiType ApiType.ADMIN_API)方法端点说明POST/v3/auth/user创建用户已存在则抛IllegalArgumentException见 L106-L117POST/v3/auth/user/admin管理员引导bootstrap仅当不存在全局管理员时可调用自动生成随机密码或使用传入密码并绑定ROLE_ADMIN见 L122-L147DELETE/v3/auth/user?username删除用户禁止删除全局管理员见 L156-L171PUT/v3/auth/user更新密码要求本人或全局管理员无认证上下文时返回 401session expired!见 L184-L215GET/v3/auth/user/list分页列表searchaccurate默认精确匹配 /searchblur模糊匹配见 L258-L272GET/v3/auth/user/search?username按用户名模糊返回匹配的用户名列表见 L280-L287IT 中createUser辅助方法UserLoginAuthApiITCase.java实际上已经间接调用了POST /v3/auth/user创建用户并通过addCleanup注册了测试结束后的删除清理只是尚未针对 CRUD 本身的正反向场景编写断言。管理员引导bootstrap语义在 default-auth-plugin-spec.md 中被强调为登录是公开的、管理员引导是刻意暴露的——两者都不需要预先认证前者用于获取 Token后者用于初始化首个管理员。四、角色 API 场景Pending 但接口面明确文档中角色 API 当前状态为PendingAPI 面 / IT 类覆盖的 API 操作当前状态当前/缺失覆盖Role auth APIGET,POST,DELETE /v3/auth/roleGET /v3/auth/role/listGET /v3/auth/role/searchPending尚无独立 IT 验证角色增删查、通配符搜索、受控的角色缺失场景对应的实现位于 RoleControllerV3.java全部接口均要求ROLE_ADMIN权限Secured(resource console/roles, action WRITE/READ, apiType ApiType.ADMIN_API)POST /v3/auth/role?roleusername为指定用户绑定角色注释明确该方法承担两种职责——创建角色并绑定到GLOBAL_ADMIN或将角色绑定到某个用户见 L56-L72DELETE /v3/auth/role?roleusername删除角色不传username默认空字符串时删除该角色下所有用户的绑定传了则只解除单个用户的绑定见 L81-L93GET /v3/auth/role/list?pageNopageSizeusernamerolesearch分页查询角色支持searchblur模糊匹配见 L105-L120GET /v3/auth/role/search?role按角色名模糊匹配角色列表见 L128-L136。文档提到的通配符搜索即searchblur模式其底层由NacosRoleService.findRoles完成模糊查询与searchaccurate的精确查询路径分离。五、权限 API 场景Pending 但接口面明确权限 API 当前状态同样为PendingAPI 面 / IT 类覆盖的 API 操作当前状态当前/缺失覆盖Permission auth APIGET,POST,DELETE /v3/auth/permissionGET /v3/auth/permission/listPending尚无独立 IT 验证权限增删查、重复检查、受控的校验错误实现位于 PermissionControllerV3.javaPOST /v3/auth/permission?roleresourceaction为角色添加权限见 L69-L77DELETE /v3/auth/permission?roleresourceaction为角色删除权限见 L87-L95GET /v3/auth/permission/list?pageNopageSizerolesearch分页查询角色的权限同样支持blur模糊搜索见 L106-L121额外提供GET /v3/auth/permission用于判断权限是否重复重复返回true这是文档提到的重复检查场景的接口落点见 L123-L130。这三类接口user/role/permission在 v3-api-surface.md 中被登记为默认认证插件管理的 API 面/v3/auth/user共 7 个端点GET/POST/PUT/DELETE/v3/auth/role共 4 个端点GET/POST/DELETE/v3/auth/permission共 4 个端点GET/POST/DELETE。六、可见性授权 API 场景Partial已覆盖核心契约6.1 覆盖范围API 面 / IT 类覆盖的 API 操作当前状态当前/缺失覆盖VisibilityGrantAuthApiITCasePOST /v3/auth/visibilityADMIN_APIDELETE /v3/auth/visibilityADMIN_APIPartial已验证对已存在的 skill 资源授权/回收、写操作归一化为rw、非法操作校验、缺失资源 404聚焦单元测试覆盖了专用角色授权模型、幂等性、运行时权限派生资源名、权限缓存失效、最大规范资源名长度、ApiType.ADMIN_API安全元数据。默认 standalone IT 配置不引导认证身份因此启用认证后的 owner/global-admin 强制仍未被覆盖VisibilityGrantAuthApiITCase继承自AiAdminApiBaseITCaseVisibilityGrantAuthApiITCase.java因为可见性授权面向的是 AI 资源skill 等。6.2 核心成功场景grant / revoke测试testGrantAndRevokeVisibilityGrantVisibilityGrantAuthApiITCase.java的完整流程为通过POST /v3/admin/ai/skill/draft创建一个 skill 资源randomAiName(visibility-auth)并注册清理回调创建被授权用户grantee调用POST /v3/auth/visibility?namespaceIdresourceTypeskillresourceNameusernameactionw断言响应data为grant visibility permission ok!调用DELETE /v3/auth/visibility参数相同断言响应data为revoke visibility permission ok!。请求参数与后端 VisibilityGrantControllerV3.java 一一对应namespaceId可选空表示默认命名空间、resourceType、resourceName、username被授权人、action。该 Controller 标注了Secured(resource ..., action WRITE, apiType ApiType.ADMIN_API, tags Constants.Tag.ONLY_IDENTITY)其中ONLY_IDENTITY标签意味着校验只基于身份完成配合ApiType.ADMIN_API构成文档提到的安全元数据。6.3 参数归一化写授权归一为rw测试中传入的 action 是w但后端存储时会归一化为rw。这一逻辑位于 DefaultVisibilityGrantService.javaprivate String normalizeGrantAction(String action) throws NacosException { // Persist write grants as rw so write authorization can imply read visibility. return VisibilityGrantRoleHelper.normalizeStoredAction(action); // 非法 action 抛 NacosApiException(INVALID_PARAM, PARAMETER_VALIDATE_ERROR) }其设计动机在源码注释中写得很清楚写授权必须同时隐含读可见性因此w被落库为rw而r保持为r。revoke时同样先归一化且在移除写授权时仅删除旧的只读行见 L103-L121 附近保证rw与历史r数据之间的幂等转换正确。6.4 边界与错误处理400 与 404 的受控返回测试testGrantValidationAndNotFoundErrorsVisibilityGrantAuthApiITCase.java验证了两个受控错误缺失资源 → 404对不存在的 skill 资源授权时返回 HTTP 404 与ErrorCode.RESOURCE_NOT_FOUND错误信息含resource not found。后端通过资源定位器locator查找资源找不到时抛出NacosApiException(NOT_FOUND, ErrorCode.RESOURCE_NOT_FOUND, ...)见 DefaultVisibilityGrantService.java而不是内部 500非法 action → 400传入actionx时返回 HTTP 400 与ErrorCode.PARAMETER_VALIDATE_ERROR信息含unsupported action。6.5 单测覆盖的纵深行为文档提到聚焦单元测试已覆盖以下行为这些断言分布在nacos-default-auth-plugin的测试代码中如 RemoteVisibilityGrantServiceTest.java专用角色授权模型每个资源-用户-动作组合由专用角色承载幂等性重复授权不产生重复数据且历史只读行的处理保证幂等运行时权限派生资源名授权校验时根据当前请求上下文派生出规范资源名权限缓存失效授权变更后及时失效缓存最大规范资源名长度限制ApiType.ADMIN_API安全元数据。6.6 已知盲区认证启用后的强制逻辑文档明确标注默认 standalone IT profile不引导认证身份不 bootstrap auth identities因此VisibilityGrantAuthApiITCase只验证了公开 API 契约与资源查找集成未验证启用认证后 owner/global-admin 的管理权强制checkManageGrantAuthority在 DefaultVisibilityGrantService.java 中会抛出ErrorCode.ACCESS_DENIED。这正是该 IT 状态为 Partial 而非 Covered 的根本原因。七、整体覆盖矩阵与后续补齐方向汇总当前仓库中认证 API 的 IT 覆盖全景API 面端点状态下一步建议补齐的场景登录POST /v3/auth/user/login、POST /v1/auth/users/loginPartial管理员引导bootstrap、用户 CRUD、密码更新、/list与/search的精确/模糊查询角色GET,POST,DELETE /v3/auth/role、/list、/searchPending角色增删、绑定/解绑、searchblur通配符搜索、删除不存在角色权限GET,POST,DELETE /v3/auth/permission、/listPending权限增删、重复检查、非法role/resource/action的 400 校验可见性授权POST/DELETE /v3/auth/visibilityPartial启用认证后的 owner/global-admin 强制、跨命名空间授权、非 skill 资源类型可以看出登录与可见性授权已有可运行的 IT 基座UserLoginAuthApiITCase、VisibilityGrantAuthApiITCase而角色与权限 API 的 Controller 层实现完整分别位于RoleControllerV3与PermissionControllerV3等待补充独立 IT。若要为这些 API 编写新测试可参考两个既有 IT 类的模式继承OpenApiBaseITCase/AiAdminApiBaseITCase、用postFormOk/deleteJsonOk/postRaw/assertError等辅助方法驱动请求并用addCleanup保证资源回收。八、总结本文以 AUTH_API_TEST_SCENARIOS.md 的覆盖矩阵为骨架结合test/openapi-test下的 IT 实现与nacos-default-auth-plugin的 Controller/Service 源码完整还原了 Nacos 认证 API 的测试现状与行为契约v1/v3 登录返回扁平 Token 对象、失败响应收敛为一致的 403 防止用户名枚举角色与权限 API 的接口面已实现但 IT 仍为 Pending可见性授权 API 已覆盖 grant/revoke、w→rw归一化、404/400 受控错误并明确了认证启用后的权限强制这一待补齐盲区。对于希望为 Nacos 认证体系补充 API 场景测试的开发者这张矩阵既是现状快照也是可直接执行的补齐清单。【免费下载链接】nacosan easy-to-use dynamic service discovery, configuration and service management platform for building AI cloud native applications.项目地址: https://gitcode.com/GitHub_Trending/na/nacos创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →