我正在开发一个SpringBoot应用程序。我正在使用SpringBooTest和TestNG在REST API上运行集成测试。这是一个无国籍的应用程序。会话未存储。
上下文
我有一个过滤器,它将身份验证对象显式设置为SecurityContext,如下所示
Authentication authentication = new UsernamePasswordAuthenticationToken(contextUser, "", null);
SecurityContextHolder.getContext().setAuthentication(authentication);
// Continue to app.
在此之后,我没有使用任何身份验证管理器,因为令牌已经过验证。我没有明确地清除安全上下文。
问题
当我从SpringBootTest运行几个测试时,第二个测试仍然可以访问第一个测试中设置的安全上下文。当我在调试模式下运行测试时,我可以看到从SecurityContextHolder.clearContext();
调用SecurityContextPersistenceFilter
,这意味着应该清除上下文。
如何解决此问题?我认为安全上下文应该在请求完成后始终清除,并且不应该用于下一次测试。
答案 0 :(得分:1)
我必须设置一个FilterChainProxy
,如下所示,以便在Spring Integration测试中执行过滤器,这将负责清除上下文。
restLoginMockMvc = MockMvcBuilders.standaloneSetup(loginResource).setControllerAdvice(exceptionTranslator)
.apply(springSecurity(springSecurityFilterChain)).build();