如何为具有 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
和登录端点,我为其他请求添加了一个过滤器。所有其他请求应具有:
Authorization
Bearer <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 模式?
如何为登录GRAILS(Spring security)的用户实现会话?