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

Spring Security中configure的hasAuthority与@PreAuthorize叠加校验问题

问题根因
  • Spring Security的authorizeRequests规则是按声明顺序匹配,匹配到第一个符合的规则就直接生效,不会继续匹配后续规则。你当前配置里把范围最广的/**匹配规则放在了/admin/**前面,所以所有/admin/**路径的请求都会先命中permitAll规则,你写的hasAuthority("ADMIN")校验完全不会触发,只有方法上的@PreAuthorize注解在生效,所以才会出现无ADMIN权限只要过了自定义校验就能访问的问题。
  • 方法上的@PreAuthorize注解当前只声明了自定义权限校验,没有加入ADMIN权限校验的逻辑。
修复步骤

1. 调整HttpSecurity规则顺序

把更精确的路径规则放在前面,宽泛的路径规则放在最后,修改后的配置如下:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
    .anonymous().principal("guest").authorities("GUEST_ROLE")
    .and()
    .authorizeRequests()
            // 精确路径规则放前面
            .antMatchers("/admin/**").hasAuthority("ADMIN")
            // 宽泛的通用规则放最后
            .antMatchers("/**").permitAll()
    .and()
    .formLogin();
}

调整后所有/admin/**路径的请求会优先校验ADMIN权限,权限不满足直接被拦截,不会进入控制器方法。

2. 补充方法注解的校验逻辑(可选,加双重保险)

如果要避免后续配置调整漏触发路径校验,可以直接在方法的@PreAuthorize里同时声明两个校验条件,确保ADMIN权限校验一定会执行:

@PreAuthorize("hasAuthority('ADMIN') and @securityService.hasPermission('SALEPOINT', #id)")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:18:05