类似于Authentication token passed to ControllerAdvice is null when running through MockMvc,无论是手动添加上下文还是使用{{1},我对带有Spring Data REST和Spring Security的Spring Boot 1.5.16应用程序的MockMvc测试始终具有空Authentication
参数}}。
这是Spring Security测试代码中的错误,还是我在某个地方搞砸了?
@WithUserDetails
方法如下:
@RepositoryRestController
我的MockMvc测试如下:
@PostMapping("/resources/{id}/attributes")
public @ResponseBody ResponseEntity<?> attributes(
@PathVariable("id") long resourceId,
@RequestParam(value = "file", required = true) MultipartFile file,
Authentication authentication ) throws IOException {
// 2.
Subject.setAuthentication(authentication);
try (InputStream input = file.getInputStream()) {
attributeHandler.read(resourceId, file.getName(), input);
}
return ResponseEntity.ok(success());
}
在测试方法中(在1.),我已经验证了身份验证的存在,但是,即使我通过手动设置了上下文(在3.),在调用控制器方法(在2.)时,身份验证也为空。 @RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@AutoConfigureMockMvc
public class RestControllerTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext webApplicationContext;
@Before
public void setup() throws Exception {
this.mockMvc = webAppContextSetup(webApplicationContext)
.apply(springSecurity())
.build();
}
@Test
@WithUserDetails("myAttributeManagerUsername")
public void attributes() throws Exception {
// 1.
Authentication authentication =
SecurityContextHolder.getContext().getAuthentication();
mockMvc.perform(
MockMvcRequestBuilders.fileUpload(
"/api/resources/1/attributes"
).file(attributesFile())
// 3. .with(authentication(authentication)))
.andExpect(status().isOk());
}
}
或.sessionAttr()
(如图所示)。在测试之外运行应用程序时,控制器方法的确会获得带有经过身份验证的主题的正确身份验证令牌(在2)。
有什么想法在我的测试中出什么问题吗?
答案 0 :(得分:0)
老兄。这可能不会特别有用,但是...
作为我(未显示)基础结构的一部分,过滤器在触发该错误的API之前错误地重置了身份验证。
对不起,噪音。