news 2026/6/10 15:28:15

Spring Security 进阶:基于 Customizer 的分布式权限配置架构设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Security 进阶:基于 Customizer 的分布式权限配置架构设计

一、 背景与痛点

在传统的 Spring Security 开发中(尤其是单体大应用),我们往往会在一个主配置类(如SecurityConfig)里写死所有的 URL 权限规则:

// 传统写法:随着业务增长,这个方法会变成几百行的“面条代码”http.authorizeHttpRequests().requestMatchers("/admin/**").hasRole("ADMIN").requestMatchers("/order/**").hasRole("USER").requestMatchers("/pay/**").permitAll()// ... 无休止的追加 ...

痛点

  1. 严重耦合:基础架构层必须感知所有业务模块的 URL 规则。
  2. 维护困难:多人开发时,大家都在修改同一个文件,代码冲突不断。
  3. 扩展性差:新增一个业务模块,必须去改主工程的代码。

二、 核心架构设计

为了解决上述问题,我们引入了“插拔式”的设计模式。核心由三个部分组成:

  1. 调度中心:主配置类(只负责调度,不负责具体规则)。
  2. 标准协议AuthorizeRequestsCustomizer抽象类(定义怎么配)。
  3. 业务实现:各模块的 Customizer(具体配什么)。

1. 调度中心:主 SecurityFilterChain

在主配置类(如YudaoWebSecurityConfigurerAdapter)中,我们不再硬编码规则,而是利用 Spring 的自动注入(Dependency Injection)特性。

// 1. 注入所有实现了 Customizer 接口的 Bean@ResourceprivateList<AuthorizeRequestsCustomizer>authorizeRequestsCustomizers;@BeanprotectedSecurityFilterChainfilterChain(HttpSecurityhttpSecurity)throwsException{httpSecurity// ... 其他配置 ....authorizeHttpRequests(c->{// 2. 核心逻辑:遍历所有注入的 Customizer,让它们自己定义规则authorizeRequestsCustomizers.forEach(customizer->customizer.customize(c));// 3. 兜底规则(最后执行)c.anyRequest().authenticated();});returnhttpSecurity.build();}

解析:主配置类变成了一个“容器”,它根本不知道/order需要什么权限,它只负责把话筒交给各个业务模块,让模块自己“发言”。

2. 标准协议:AuthorizeRequestsCustomizer

我们需要定义一个抽象类,既作为统一的接口类型,又可以提供一些通用的工具方法(如 API 前缀处理)。

publicabstractclassAuthorizeRequestsCustomizerimplementsCustomizer<AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry>,Ordered{@ResourceprivateWebPropertieswebProperties;// 提供通用方法的封装,避免各模块硬编码前缀protectedStringbuildAdminApi(Stringurl){returnwebProperties.getAdminApi().getPrefix()+url;}protectedStringbuildAppApi(Stringurl){returnwebProperties.getAppApi().getPrefix()+url;}// 默认优先级,业务模块可以通过重写此方法调整自己在过滤器链中的位置@OverridepublicintgetOrder(){return0;}}

3. 业务实现:模块化的 Customizer

假设我们有一个“基础设施模块 (Infra)”,它需要开放 Swagger 文档和一些监控断点,我们不需要改主工程,只需在 Infra 模块内部写一个 Bean:

@ConfigurationpublicclassInfraSecurityConfiguration{@Bean("infraAuthorizeRequestsCustomizer")publicAuthorizeRequestsCustomizerinfraAuthorizeRequestsCustomizer(){returnnewAuthorizeRequestsCustomizer(){@Overridepublicvoidcustomize(AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry registry){// 定义该模块独有的权限规则registry.requestMatchers(buildAdminApi("/infra/file/**")).permitAll()// 文件下载免登录.requestMatchers("/swagger-ui/**").permitAll()// Swagger 免登录.requestMatchers("/druid/**").hasRole("ADMIN");// 数据库监控需管理员}// 可选:如果需要在其他规则之前生效,可以调高优先级@OverridepublicintgetOrder(){return-10;}};}}

三、 工作原理深度解析

这个机制之所以能工作,依赖于 Spring 容器强大的生命周期管理:

  1. 启动扫描 (Scanning)
    Spring Boot 启动时,扫描所有加了@Configuration的类。
  2. Bean 注册 (Registration)
    各个业务模块(Infra, Order, Pay)定义的AuthorizeRequestsCustomizer被实例化并注册到 Spring 容器中。
  3. 依赖收集 (Collection)
    当初始化主配置类YudaoWebSecurityConfigurerAdapter时,@Resource private List<AuthorizeRequestsCustomizer> list这行代码会触发 Spring 去容器里查找所有类型为AuthorizeRequestsCustomizer的 Bean,并将它们装进一个 List 集合中。
  4. 规则应用 (Application)
    在构建SecurityFilterChain时,代码遍历这个 List,依次调用customize()方法。
  5. 最终生效 (Finalization)
    Spring Security 将这些分散定义的规则合并成一个完整的RequestMatcher链条。

四、 优缺点总结

优点

  • 开闭原则 (Open/Closed Principle):对扩展开放(新增模块只需加新 Bean),对修改关闭(无需动主配置)。
  • 高内聚:业务模块的权限规则写在业务模块内部,代码物理距离更近,更容易理解。
  • 灵活性:通过Ordered接口,可以精确控制规则的生效顺序(例如:通用黑名单规则优先级最高,普通业务规则优先级居中,兜底规则优先级最低)。

注意事项

  • 顺序问题:Spring Security 的匹配原则是“先匹配生效(First Match Wins)”。如果一个优先级高的 Customizer 配置了/**->permitAll,那么后面所有模块的规则都会失效。因此使用Ordered进行顺序管理至关重要。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 10:57:26

HTTP协议在Java大附件上传中如何优化秒传功能的性能?

项目技术方案&#xff1a;大文件传输系统&#xff08;信创兼容版&#xff09; 编制&#xff1a;湖南长沙某软件公司 技术部 日期&#xff1a;2023年11月20日 一、项目背景与需求分析 公司承接政府项目&#xff0c;需开发一套支持50G文件传输的系统&#xff0c;核心需求如下&a…

作者头像 李华
网站建设 2026/6/10 10:55:52

量产前夜的围剿?EMB专利之争,初创公司与老牌玩家的困局

智能底盘赛道&#xff0c;在迎来“纯线控”大周期的同时&#xff0c;竞争也在加剧。11月底&#xff0c;上市公司伯特利发布公告&#xff0c;起诉苏州坐标系所取得的5项专利属于非法取得&#xff0c;被告通过所获知的公司电子机械制动系统&#xff08;EMB&#xff09; 等产品的相…

作者头像 李华
网站建设 2026/6/10 10:53:59

基于springboot医疗挂号管理系统

系统简介 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对医疗挂号信息管理的提升&…

作者头像 李华
网站建设 2026/6/10 10:54:29

8 个降AI率工具,自考人必备的高效降重神器

8 个降AI率工具&#xff0c;自考人必备的高效降重神器 AI降重工具&#xff0c;自考论文的高效护航者 在当前的学术环境中&#xff0c;越来越多的高校和考试机构开始引入AIGC检测系统&#xff0c;这对自考学生的论文写作提出了更高要求。如何在保证内容质量的同时&#xff0c;有…

作者头像 李华
网站建设 2026/6/10 0:29:36

【日记】今天打了一天飞机(435 字)

正文 今天打了一天飞机…… 好爽。 第一次被敌人锁定的时候也让人头皮发麻&#xff0c;我甚至不知道怎么做规避。不过后面被锁着锁着就习惯了…… 后面告诉我能做高 G 滚翻&#xff0c;我试了一下&#xff0c;现实中这么玩儿飞行员早昏迷了吧…… 哪个任务我忘了&#xff0c;让…

作者头像 李华
网站建设 2026/6/10 10:58:04

Python+selenium自动化元素定位防踩坑(建议收藏)

踩坑一&#xff1a;StaleElementReferenceException selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document 异常原因&#xff1a; 意思是&#xff0c;引用的元素已过期。原因是页面…

作者头像 李华