Аналогично Маркер аутентификации, передаваемый в ControllerAdvice, имеет значение null при запуске через MockMvc , мои тесты MockMvc для приложения Spring Boot 1.5.16 с Spring Data REST и Spring Security всегда имеют нулевой параметр Authentication
, независимо от того,Я добавляю контекст вручную или с помощью @WithUserDetails
.
Это ошибка в коде тестирования Spring Security, или я что-то напутал?
Методы @RepositoryRestController
выглядят так:
@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());
}
и мои тесты MockMvc выглядят следующим образом:
@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());
}
}
В методе теста (на 1.) я проверил, что аутентификация присутствует, но когда вызывается метод контроллера (на 2.) аутентификация нулевая, даже если я вручную установил контекст (на 3.) через .sessionAttr()
или .with()
(как показано).При запуске приложения вне тестов методы контроллера действительно получают токен аутентификации (на 2.) с аутентифицированными субъектами.
Есть идеи, что не так в моих тестах?