Spring集成测试 – AuthenticationPrincipal未注入

我正在尝试在我的项目中使用kotlin,这是REST API端点服务于angularjs前端。 我用我们的api文件的spring rest doc。

在迁移时,我发现我的安全上下文不是注入测试用例。

用mockito-kotlin测试课(主要由Intellij转换):

@RunWith(SpringJUnit4ClassRunner::class) @ContextConfiguration(classes = arrayOf(MockAppConfig::class)) @WebAppConfiguration class UserLoginDocumentation { @get:Rule var restDocumentation = JUnitRestDocumentation("target/generated-snippets") private var mockMvc: MockMvc? = null @Autowired private val context: WebApplicationContext? = null @Before fun setUp() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context!!) .apply<DefaultMockMvcBuilder>(documentationConfiguration(this.restDocumentation) .uris().withScheme("https").withHost("myhost.com").withPort(443)).build() val authentication = TestingAuthenticationToken(MyUserDetailsService.MyUserDetails(1L), null) SecurityContextHolder.getContext().authentication = authentication } @Autowired lateinit var userLoginService: UserLoginService @Test @Throws(Exception::class) fun loginTest() { whenever(userLoginService!!.getUserInfo(any(), any(), any())).thenReturn(LoginUserInfo()) this.mockMvc!!.perform(post("/myloginURL/user")//the remaining is not important.... 

控制器:

 @RequestMapping("/myloginURL") @RestController class UserLoginController @Autowired constructor( val userLoginService: UserLoginService) { @ResponseStatus(HttpStatus.OK) @RequestMapping(value = "/user", method = arrayOf(RequestMethod.POST), produces = arrayOf(MediaType.APPLICATION_JSON_VALUE)) fun getUser(@AuthenticationPrincipal userDetail: MyUserDetails, request: HttpServletRequest, @RequestParam lang: String): LoginUserInfo? { return userLoginService.getUserInfo(userDetail.userId, request.getHeader("Authorization"), lang) } } 

这里的userDetail不为null,但userDetail.userId为null。 所以看起来好像测试类中的认证不会被注入到控制器调用中。

我做错了什么,或者如何解决?

我应该使用MockMvcBuilders.webAppContextSetup(this.context!!) .apply(springSecurity(springSecurityFilterChain))

springSecurityFilterChain使用@EnableWebSecurity自动装配

之后,我可以使用csrf和我想要的用户,userDetail注入到控制器。

参考: http : //docs.spring.io/spring-security/site/docs/current/reference/html/test-mockmvc.html#test-mockmvc-setup