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
相关产品推荐
相关产品推荐

