@RespositoryRestController 中的空认证@WithUserDetails

Null authentication @WithUserDetails in @RespositoryRestController

类似于,我的 MockMvc 测试 Spring Boot 1.5.16 应用程序 Spring Data REST 和 Spring Security 总是有一个空值 Authentication 参数是我手动添加上下文还是使用 @WithUserDetails.

这是 Spring 安全测试代码中的错误,还是我搞砸了什么地方?

@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.)和经过身份验证的主题。

知道我的测试有什么问题吗?

哎呀。这不太可能特别有用,但是...

作为我的(未显示)基础设施的一部分,过滤器在 API 之前错误地重置了身份验证,这触发了此错误。

抱歉噪音太大了。