@RespositoryRestController中的空身份验证@WithUserDetails

时间:2018-12-20 20:24:10

标签: java spring-security spring-data-rest

类似于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)。

有什么想法在我的测试中出什么问题吗?

1 个答案:

答案 0 :(得分:0)

老兄。这可能不会特别有用,但是...

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

对不起,噪音。