You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@WithMockUser的Spring Security MockMVC始终返回成功状态问题

问题分析与解决方案

看起来你遇到的核心问题是Spring Security配置在MockMvc测试中没有生效,导致权限校验完全被绕过,不管用户角色是什么都返回200。我帮你梳理下问题根源和解决步骤:

核心问题1:MockMvc请求路径错误

你在测试中使用了完整的HTTP URL(http://localhost:" + port),但MockMvc是基于Spring上下文的模拟请求工具,不需要真实的域名和端口。使用完整URL时,请求会被当作外部HTTP请求发送到随机端口,直接绕过了Spring Security的过滤器链,自然不会触发权限校验。

核心问题2:MockMvc配置冲突

你同时使用了@AutoConfigureMockMvc自动注入MockMvc,又在@Before方法里手动创建了MockMvc实例,这可能导致配置冲突,Spring Security的规则没有被正确应用到测试用的MockMvc中。


修正步骤

1. 修正请求路径,使用相对路径

把测试中的get("http://localhost:" + port)改成get("/"),让请求走Spring内部的DispatcherServlet和Security过滤器链:

2. 简化MockMvc配置,避免冲突

删除@Before方法里手动创建MockMvc的代码,直接使用@AutoConfigureMockMvc自动注入的实例即可(它会自动集成Spring Security)。

修正后的测试类示例:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class DataControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    @WithMockUser(roles = {"ADMIN"})
    public void getRequest_WithAdminRole_ShouldReturnSuccess() throws Exception {
        this.mockMvc.perform(get("/"))
                .andDo(print())
                .andExpect(status().is2xxSuccessful())
                .andExpect(content().string("HELLO!"));
    }

    @Test
    @WithMockUser // 默认赋予ROLE_USER权限
    public void getRequest_WithUserRole_ShouldReturnForbidden() throws Exception {
        this.mockMvc.perform(get("/"))
                .andDo(print())
                .andExpect(status().isForbidden()); // 预期403,因为需要ADMIN角色
    }
}

3. 确认SecurityConfig的正确性

你的SecurityConfig配置是正确的:antMatchers("/").hasRole("ADMIN")会要求访问根路径的用户必须拥有ROLE_ADMIN权限(hasRole会自动添加ROLE_前缀,和@WithMockUser(roles = {"ADMIN"})匹配)。

如果配置还是不生效,可以在测试类上添加@Import(SecurityConfig.class),强制Spring加载你的安全配置类,确保它被纳入测试上下文。


验证效果

修改后重新运行测试,你会看到:

  • 带ADMIN角色的测试用例返回200
  • 仅带USER角色的测试用例返回403 Forbidden,符合你的预期

内容的提问来源于stack exchange,提问作者jden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:22:20