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