【发布时间】: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