ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

spring-addons测试秘籍:@WithMockAuthentication与@WithJwt让OAuth2单元测试简单10倍

spring-addons测试秘籍:@WithMockAuthentication与@WithJwt让OAuth2单元测试简单10倍 spring-addons测试秘籍WithMockAuthentication与WithJwt让OAuth2单元测试简单10倍【免费下载链接】spring-addonsAdditional Spring Boot auto-configuration for OAuth2 / OpenID REST项目地址: https://gitcode.com/gh_mirrors/sp/spring-addons如果你正在为 Spring Boot 项目的 OAuth2单元测试头疼那这篇 spring-addons 测试秘籍就是为你准备的。spring-addons 是一个为 Spring Boot 提供 OAuth2/OpenID 与 REST 自动配置的增强库它的spring-addons-oauth2-test模块内置了WithMockAuthentication、WithJwt等开箱即用的测试注解让你不用再启动 Keycloak、不用 mock Token 端点也能写出覆盖各种用户角色的 OAuth2单元测试效率直接翻倍。为什么你的OAuth2单元测试又慢又难写 传统的 OAuth2/OpenID 测试有多痛苦写过的人都懂为了模拟一个已登录用户你得先启动本地 Keycloak 或者 Auth0再配置好 client、realm稍有不慎就 401。不用真实授权服务器那就手动构造 JWT、拼 Header、签名字符串还要保证和你的JwtAuthenticationConverter逻辑一致代码又臭又长。想测不同角色的用户你得复制粘贴一大坨 token 构造代码维护成本极高。其实 OAuth2 授权码流程本身并不复杂见下图复杂的是测试时如何在内存里伪造出那个最终生成的认证对象spring-addons 的思路很简单用一行注解把 SecurityContext 里的 Authentication 直接填好让你把精力放在业务断言上而不是环境搭建上。三步完成 spring-addons测试环境搭建 ⚙️第一步在pom.xml中加入测试依赖。最省事的是引入spring-addons-starter-oidc-test它会连带引入spring-addons-oauth2-test以及 starter-oidc 的测试辅助配置dependency groupIdcom.c4-soft.springaddons/groupId artifactIdspring-addons-starter-oidc-test/artifactId scopetest/scope /dependency第二步测试类上使用WebMvcTestServlet 栈或WebFluxTest响应式栈只加载控制器切片。第三步加一个AutoConfigureAddonsWebmvcResourceServerSecurity或 WebFlux 对应版本并Import你的安全配置就可以注入MockMvcSupport/WebTestClientSupport发请求了。这一步的关键源码在spring-addons-starter-oidc-test/src/main/java/com/c4_soft/springaddons/security/oauth2/test/webmvc/目录下例如MockMvcSupport.java内置了get、post、put、delete等快捷方法连 CSRF 都帮你处理好了。WithMockAuthentication用法一行注解模拟任意登录用户 WithMockAuthentication是日常最常用的注解它直接向 SecurityContext 放入一个 Mockito 模拟的Authentication你只需要关心用户名和权限WithMockAuthentication(authType JwtAuthenticationToken.class, principalType Jwt.class, name Ch4mpy, authorities ROLE_AUTHORIZED_PERSONNEL) Test void givenUserIsCh4mpy_whenGetGreet_thenOk() { api.get(/greet).andExpect(status().isOk()); }name登录用户名默认userauthorities授予的权限列表如ROLE_AUTHORIZED_PERSONNELauthType/principalType指定 Authentication 与 Principal 的具体类型比如模拟 JWT 资源服务器场景不指定时默认AuthenticationPrincipal。它的实现就在spring-addons-oauth2-test/src/main/java/com/c4_soft/springaddons/security/oauth2/test/annotations/WithMockAuthentication.java核心逻辑只有几行用MockAuthenticationBuilder拼出一个 Mock 认证对象塞进SecurityContextHolder。对比一下没有注解时的写法从几十行 token 构造代码变成一行注解这就是简单 10 倍的底气。想看完整范例可以翻samples/webmvc-jwt-default下的GreetingControllerAnnotatedTest.java匿名、普通用户、无权限用户、管理员四个场景一目了然。WithJwt用法用真实JWT claims做OAuth2单元测试 如果你希望测试走一遍真实的安全配置包括你自定义的JwtAuthenticationConverter、authorities 映射等WithJwt是更好的选择。它会把 classpath 下的 JSON 文件解析成 JWT claims再喂给你项目里配置好的 converter 生成认证对象Test WithJwt(ch4mp.json) void givenUserIsCh4mp_whenGetGreet_thenOk() { api.get(/greet).andExpect(content().string(Hello ch4mp! ...)); }其中ch4mp.json就是放在src/test/resources下的一段 JSON claims。WithJwt还支持WithJwt(json {\sub\: \42\, \roles\: [\ADMIN\]})直接内联 JSON适合临时测试WithJwt(file xxx.json)与value互为别名指向 classpath 文件headers/bearerString自定义 JWT 头与 Bearer 串。实现细节在spring-addons-oauth2-test/src/main/java/com/c4_soft/springaddons/security/oauth2/test/annotations/WithJwt.java注意其中的WithJwt.AuthenticationFactory它会在你的jwtAuthenticationConverter存在时优先使用保证测试用的认证和线上逻辑完全一致。一个测试覆盖多个用户OAuth2参数化测试技巧 真实项目中不同角色访问同一接口是最高频的测试需求。与其复制粘贴多个Test不如用参数化测试一把梭ParameterizedTest AuthenticationSource({ WithMockAuthentication(name ch4mp, authorities ROLE_AUTHORIZED_PERSONNEL), WithMockAuthentication(name tonton-pirate, authorities {UNCLE, SKIPPER}) }) void givenAnyUser_whenGetGreet_thenOk(ParameterizedAuthentication Authentication auth) { api.get(/greet).andExpect(content().string( Hello %s! ....formatted(auth.getName(), auth.getAuthorities()))); }配合WithJwt.AuthenticationFactory还能从多个 JSON 文件批量生成认证Autowired WithJwt.AuthenticationFactory authFactory; StreamAbstractAuthenticationToken identities() { return authFactory.authenticationsFrom(ch4mp.json, tonton-pirate.json); }这套AuthenticationSource、ParameterizedAuthentication系列注解位于spring-addons-oauth2-test/.../annotations/parameterized/目录强烈建议在你的测试基类里复用。WebFlux响应式测试同样简单 ⚡如果你是 WebFlux 项目别担心响应式测试的玩法几乎一致把WebMvcTest换成WebFluxTestMockMvcSupport换成WebTestClientSupport注解照样用WebFluxTest(GreetingController.class) AutoConfigureAddonsWebfluxResourceServerSecurity Import(SecurityConfig.class) class GreetingControllerAnnotatedTest { Test WithJwt(ch4mp.json) void givenUserIsCh4mp_whenGetGreet_thenOk() { api.get(/greet).expectBody(String.class).isEqualTo(Hello ch4mp! ...); } }参考实现在samples/webflux-jwt-oauthentication的GreetingControllerAnnotatedTest.java响应式安全配置对应的测试类都集中在spring-addons-starter-oidc-test/.../webflux/目录下。常见坑与最佳实践清单 ✅最后送你一份避坑清单都是实战中容易踩的匿名请求别忘了测WithAnonymousUser断言 401/403确认未认证被正确拦截。方法级安全单独测PreAuthorize等注解保护的方法建议用TestSecurityContextHolder.setAuthentication(...)显式控制上下文。JSON 文件命名清晰把 claims 文件按角色场景命名如admin.json、tester.json团队协作更友好。优先级选择只关心权限就用WithMockAuthentication快要验证 claims 转换逻辑就用WithJwt真。别用废弃注解早期版本有WithMockJwtAuth官方已标注 deprecated参数化测试里 claims 与 authorities 一致性较差建议改用上面的两个注解。总结 spring-addons 把 OAuth2单元测试从基建工程变成了写断言核心就是WithMockAuthentication与WithJwt这两把钥匙。前者一行注解搞定任意用户后者让测试走真实认证链路再配上参数化测试和 WebFlux 支持覆盖所有角色场景不再是负担。动手改造你的第一个测试类你会回来感谢这篇秘籍的。【免费下载链接】spring-addonsAdditional Spring Boot auto-configuration for OAuth2 / OpenID REST项目地址: https://gitcode.com/gh_mirrors/sp/spring-addons创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表