【问题标题】:Spring transfer SecurityContext for Integration testingSpring传输SecurityContext进行集成测试
【发布时间】:2017-06-11 22:27:49
【问题描述】:

我想测试我的 REST 端点。在我的 REST 方法中有一些基于 SecurityContext 的过滤器。当我在我的测试类中设置 SecurityContext 并调用其余方法时,SecurityContext 被删除。只有当我在我的 REST 方法中创建 SecurityContext 时,它才会生效。 有没有可能如何转移上下文?

SecurityContext securityContext = new SecurityContextImpl();
    securityContext.setAuthentication(authentication);
    SecurityContextHolder.setContext(securityContext);
    // is here User ...
    .mockMvc.perform(get("/test"...)

休息控制器:

public ResponseEntity<...> getTest(){
 // is now anonymus
 SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}

谢谢

【问题讨论】:

  • 你应该(几乎)永远不要在你的代码中直接调用SecurityContextHolder。相反,您应该只在控制器方法中包含 Authentication 类型的参数,然后 Spring 将注入它(就像 HttpServletRequest/ResponseSessionModel 和许多其他类型一样)

标签: java spring rest spring-security


【解决方案1】:

您可以使用defaultRequest 方法设置对同一测试类中的所有测试重复使用的身份验证:

@BeforeClass
public void setUp()
{
    mockMvc = MockMvcBuilders.webAppContextSetup(wac).defaultRequest(get("/").with(authentication(authentication))).apply(springSecurity()).build();
}

您需要的静态导入是:

import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.authentication;
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-22
    • 2018-02-01
    • 2015-08-12
    • 1970-01-01
    • 2020-07-24
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多