【发布时间】:2018-06-19 17:15:07
【问题描述】:
我有一个 spring boot(版本 1.5.9.RELEASE)应用程序,它使用 spring-session 在 Redis 上存储会话。它还使用 spring-security 对用户进行身份验证。运行应用程序时,成功登录后,安全上下文包含 Authentication 对象。但是在运行单元测试时,我收到此错误消息Authentication should not be null。重现代码如下:
@SpringBootApplication
public class DemoRedisDataSessionApplication {
@Configuration
@EnableWebSecurity
@EnableRedisHttpSession(redisNamespace = "demo-redis-spring-session")
public static class AppConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("user").password("0000").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin().and()
.authorizeRequests().anyRequest().fullyAuthenticated();
}
}
@RestController
public static class AppController {
@GetMapping("/secured")
public String secured() {
return "secured";
}
}
public static void main(String[] args) {
SpringApplication.run(DemoRedisDataSessionApplication.class, args);
}
}
这里是 application.properties
spring.session.store-type=redis
这是失败的测试
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class DemoRedisDataSessionApplicationTests {
@Autowired
private MockMvc mockMvc;
@Test
public void testUserShouldBeAuthenticated() throws Exception {
mockMvc.perform(formLogin().user("user").password("0000"))
.andExpect(status().is3xxRedirection())
.andExpect(authenticated());
}
}
失败测试的错误信息:
java.lang.AssertionError: Authentication should not be null
at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:35)
at org.springframework.test.util.AssertionErrors.assertTrue(AssertionErrors.java:65)
at org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers$AuthenticatedMatcher.match(SecurityMockMvcResultMatchers.java:98)
尤其是 HttpSessionSecurityContextRepository 第 110 行中的会话似乎为空,但我不明白为什么。
我希望用户通过身份验证并在成功登录后填充SecurityContext。你知道如何解决这个问题吗?
【问题讨论】:
标签: spring-boot spring-security spring-test spring-session