@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 之前错误地重置了身份验证,这触发了此错误。
抱歉噪音太大了。
类似于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 之前错误地重置了身份验证,这触发了此错误。
抱歉噪音太大了。