Spring Security中绝对路径与正则路径RBAC权限优先级配置问题
Spring Security WebFlux RBAC 权限配置解决方案
你的问题核心在于Spring Security的授权规则是按配置顺序匹配的——先定义的规则会优先生效,一旦路径匹配成功,后续规则就不会再执行。你之前把宽泛的/api/v1/user/**规则放在前面,导致/api/v1/user/bankDetails被这条规则先匹配,自然会忽略后面的admin权限限制。
正确的配置方式
只需要调整规则顺序,把更具体的路径规则放在前面,再配置宽泛规则并排除不需要限制的getInfo路径即可:
http .authorizeExchange(exchanges -> exchanges // 1. 优先匹配具体路径:仅admin权限可访问bankDetails .pathMatchers("/api/v1/user/bankDetails").hasAuthority("admin") // 2. 匹配/user/**下除getInfo外的所有路径:read权限即可访问 .pathMatchers("/api/v1/user/**").excludePath("/api/v1/user/getInfo").hasAuthority("read") // 可选:默认规则,确保所有其他路径都需要认证 .anyExchange().authenticated() );
配置逻辑说明
- 规则顺序优先级:先配置
/api/v1/user/bankDetails,当请求这个路径时,会直接匹配这条规则,检查用户是否有admin权限,不会再走后面的宽泛规则。 - 排除特定路径:通过
excludePath("/api/v1/user/getInfo"),让/api/v1/user/getInfo不受read权限限制(如果这个路径不需要权限,可以单独配置permitAll())。 - 默认兜底规则:
anyExchange().authenticated()确保所有未匹配到前面规则的路径,都需要用户先完成认证。
另一种等价写法
如果你习惯链式调用的风格,也可以这样写:
http .authorizeExchange() .pathMatchers("/api/v1/user/bankDetails").hasAuthority("admin") .pathMatchers("/api/v1/user/**").not().pathMatchers("/api/v1/user/getInfo").hasAuthority("read") .anyExchange().authenticated();
内容的提问来源于stack exchange,提问作者prabhu_axm
相关产品推荐
相关产品推荐

