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

MockMvc测试异常:含JWT认证时无论权限均返回200而非403

问题根源

你的Spring Security授权规则顺序错误,/api/**的permitAll()规则优先级高于/admin/api/**的权限校验规则。由于/admin/api/orders/属于/api/**的匹配范围,请求会被第一个规则直接放行,后续的hasRole("ADMIN")校验根本不会执行,这就是为什么只要有认证就返回200的原因。

修复步骤

调整授权规则的顺序,把更具体的路径规则放在前面,通用路径规则放在后面,修改SecurityConfig中的authorizeHttpRequests配置:

.authorizeHttpRequests(auth -> {
    auth.requestMatchers("/").permitAll();
    auth.requestMatchers("/auth/**").permitAll();
    auth.requestMatchers("/api/cart/**").hasAnyRole("ADMIN", "USER");
    auth.requestMatchers("/admin/api/**").hasRole("ADMIN");
    auth.requestMatchers("/api/**").permitAll(); // 通用规则移到最后
    auth.anyRequest().authenticated();
});
额外注意事项
  1. 测试用例的权限写法:Spring Security的hasRole()方法会自动给角色名添加ROLE_前缀,所以测试时传入的权限需要带前缀才能匹配:
    // 验证普通用户访问被拒绝
    @Test
    public void testGetOrders_Forbidden() throws Exception {
        mockMvc.perform(get("/admin/api/orders/")
                        .with(jwt().authorities(new SimpleGrantedAuthority("ROLE_USER"))))
                .andExpect(status().isForbidden());
    }
    
    // 验证管理员访问允许
    @Test
    public void testGetOrders_Ok() throws Exception {
        mockMvc.perform(get("/admin/api/orders/")
                        .with(jwt().authorities(new SimpleGrantedAuthority("ROLE_ADMIN"))))
                .andExpect(status().isOk());
    }
    
  2. JWT转换器校验:确认你的jwtAuthenticationConverter()是否正确将JWT中的角色转换为带ROLE_前缀的权限,否则实际运行时(比如Postman)也会出现权限校验异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:34:55