我最近继承了一些Java代码,需要在HttpSecurity配置中将其切换为无状态:
http.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
此后,使用MockMvc的某些测试失败。我知道@WithMockUser将无法在无状态的情况下工作,那么我应该如何更改以使其通过? 这是一个示例测试:
@Before
public void setUp() throws Exception {
this.mockMvc = MockMvcBuilders.standaloneSetup(apAdminController)
.apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain))
.setCustomArgumentResolvers(new PageableHandlerMethodArgumentResolver())
.build();
storeUser = new StoreUser();
storeUser.setUsername("smith");
storeUser.setEnabled(true);
}
@Test
@WithMockUser(roles = "ADMIN")
public void testViewStoreUserWithAdmin() {
try {
mockMvc.perform(
get("{resource}/1", RESOURCE).with(testSecurityContext()))
.andDo(print())
.andExpect(status().isOk());
} catch (Exception e) {
fail("Test failed: " + e.getMessage());
}
}
答案 0 :(得分:0)
我花了很长时间才能找到答案,这是我最终得到的结果,以防万一有人在挣扎:
将SessionCreationPolicy从“ If_REQUIRED”或“ ALWAYS”更改为“ STATELESS”后
在测试中:
替换导入.SecurityMockMvcRequestPostProcessors.testSecurityContext;
来导入.SecurityMockMvcRequestPostProcessors.user;
并在设置中使用它:
this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
.addFilters(springSecurityFilterChain)
.build();
删除所有注释@WithMockUser
最后,更改
get("{resource}", RESOURCE).with(testSecurityContext()))
到get("{resource}", RESOURCE).with(user("admin").roles("ADMIN")))