将SpringBootTest与TestNG一起使用时,不会清除SecurityContext

时间:2017-05-18 19:50:00

标签: spring spring-boot spring-security testng

我正在开发一个SpringBoot应用程序。我正在使用SpringBooTest和TestNG在REST API上运行集成测试。这是一个无国籍的应用程序。会话未存储。

上下文

我有一个过滤器,它将身份验证对象显式设置为SecurityContext,如下所示

Authentication authentication = new UsernamePasswordAuthenticationToken(contextUser, "", null);
SecurityContextHolder.getContext().setAuthentication(authentication);
// Continue to app.

在此之后,我没有使用任何身份验证管理器,因为令牌已经过验证。我没有明确地清除安全上下文。

问题

当我从SpringBootTest运行几个测试时,第二个测试仍然可以访问第一个测试中设置的安全上下文。当我在调试模式下运行测试时,我可以看到从SecurityContextHolder.clearContext();调用SecurityContextPersistenceFilter,这意味着应该清除上下文。

如何解决此问题?我认为安全上下文应该在请求完成后始终清除,并且不应该用于下一次测试。

1 个答案:

答案 0 :(得分:1)

我必须设置一个FilterChainProxy,如下所示,以便在Spring Integration测试中执行过滤器,这将负责清除上下文。

restLoginMockMvc = MockMvcBuilders.standaloneSetup(loginResource).setControllerAdvice(exceptionTranslator)
            .apply(springSecurity(springSecurityFilterChain)).build();