Нулевая аутентификация @WithUserDetails в @RespositoryRestController - PullRequest
0 голосов
/ 20 декабря 2018

Аналогично Маркер аутентификации, передаваемый в 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.) с аутентифицированными субъектами.

Есть идеи, что не так в моих тестах?

1 Ответ

0 голосов
/ 23 января 2019

Gee.Это вряд ли будет особенно полезно, но ...

Как часть моей (не показана) инфраструктуры, фильтр неправильно сбрасывал аутентификацию до API, который вызвал эту ошибку.

Извинитео шуме.

...