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(); });
额外注意事项
- 测试用例的权限写法: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()); } - JWT转换器校验:确认你的
jwtAuthenticationConverter()是否正确将JWT中的角色转换为带ROLE_前缀的权限,否则实际运行时(比如Postman)也会出现权限校验异常。
内容的提问来源于stack exchange,提问作者TheClassicSmoke
相关产品推荐
相关产品推荐

