您不应该直接添加 FilterChainProxy。相反,您应该申请SecurityMockMvcConfigurers.springSecurity()
如所示参考资料 http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#test-mockmvc-setup。下面包含一个示例:
mockMvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build();
结果是:
- the
FilterChainProxy
添加为Filter
to MockMvc
(正如你所做的那样)
- the
TestSecurityContextHolderPostProcessor
被添加
Why is TestSecurityContextHolderPostProcessor
必要的?原因是我们需要将当前用户从测试方法传达给MockHttpServletRequest
即被创建。这是必要的,因为 Spring Security 的SecurityContextRepositoryFilter
将覆盖任何值SecurityContextHolder
是当前找到的值SecurityContextRepository
(即SecurityContext
in HttpSession
).
Update
请记住,方法名称中包含角色的任何内容都会自动为传入的字符串添加前缀“ROLE_”。
根据您的评论,问题是您需要更新配置以使用 hasRole 而不是 hasAuthority (因为您的注释正在使用角色):
.authorizeRequests()
.antMatchers("/api/user/**", "/user").authenticated()
.antMatchers("/api/admin/**", "/templates/admin/**", "/admin/**").hasRole("ADMIN")
.anyRequest().permitAll();
或者
在 Spring Security 4.0.2+ 中,您可以使用:
@WithMockUser(authorities="ADMIN")