【问题标题】:SecurityContext is not getting cleared when using SpringBootTest with TestNG将 SpringBootTest 与 TestNG 一起使用时,SecurityContext 未清除
【发布时间】:2017-05-19 11:01:31
【问题描述】:

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

上下文

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

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

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

问题

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

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

【问题讨论】:

  • 所有请求都经过安全链吗?如果其中一些没有通过安全链但您的过滤器仍然被调用,那么您基本上是有泄漏。
  • 我将 permitAll() 设置为 /authenticate/authenticate 的资源类调用身份验证管理器并设置安全上下文。看起来它不会通过 permitAll 的安全链?这个/authenticate 请求也没有通过OP 中提到的过滤器,因为它被配置为http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);

标签: spring spring-boot spring-security testng


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    相关资源
    最近更新 更多