如何为具有 Spring Security 配置的 Spring Boot API 编写单元测试

Posted

技术标签:

【中文标题】如何为具有 Spring Security 配置的 Spring Boot API 编写单元测试【英文标题】:How to write unit test for SpringBoot API having Spring Security configured 【发布时间】:2020-09-18 07:15:31 【问题描述】:

我创建了一个包含各种端点的 Spring Boot 应用程序。除了signup 和登录端点,我为其他请求添加了一个过滤器。所有其他请求应具有:

AuthorizationBearer <token>

并且请求通过 Spring Security 过滤器链,该过滤器链通过UserDetailService 检查用户是否存在于表中。

我想知道如何使用 Spring Security 为任何 GET/POST API 编写单元测试?

我想到的一种方法是通过调用signup API 生成实际令牌,然后使用 Signup API 生成的授权令牌调用其他 API。

可能有一些方法可以模拟或跳过单元测试的授权承载

我想知道遵循的正确/最佳方法是什么?

【问题讨论】:

【参考方案1】:

对于我的应用程序,我一直在使用 MockUser 注释与 MockMvc bean 的组合。 MockUser 能够使用用户及其主体填充 Spring SecurityContext,其中包括他的 User 对象和 GrantedAuthority(又名角色)。有了这个,您可以测试您的控制器,而无需创建任何令牌。它更容易,并且与您的身份验证过程更加分离。

像这样:

@Test
@WithMockUser("admin")  
void testAuthorize() throws Exception 
    this.mockMvc.perform(get("/objects")).andExpect(status().isOk());

在 Spring 文档中,您可以阅读更多 about。你还有@WithAnonymousUser,用来模拟匿名用户,@WithUserDetails 用来放置自定义UserDetailsService

【讨论】:

以上是关于如何为具有 Spring Security 配置的 Spring Boot API 编写单元测试的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security - OAuth2 和 CustomAuthenticationProvider。如何为每个配置不同的 URL 模式?

如何为 Spring Security 启用日志记录?

如何为 Spring Security 启用日志记录?

如何为登录GRAILS(Spring security)的用户实现会话?

如何为 Spring Security 创建类型安全的用户角色?

如何为 spring webflux 应用程序配置 oauth2 资源服务器?