最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Security基于Customizer 的分布式權(quán)限配置最佳實踐指南

 更新時間:2025年12月26日 10:52:05   作者:czlczl20020925  
本文介紹了如何通過引入“插拔式”設(shè)計模式來解決SpringSecurity開發(fā)中的痛點,包括調(diào)度中心、標準協(xié)議和業(yè)務(wù)實現(xiàn)三個部分,并詳細介紹了這個機制的工作原理、優(yōu)點和注意事項,感興趣的朋友跟隨小編一起看看吧

一、 背景與痛點

在傳統(tǒng)的 Spring Security 開發(fā)中(尤其是單體大應(yīng)用),我們往往會在一個主配置類(如 SecurityConfig)里寫死所有的 URL 權(quán)限規(guī)則:

// 傳統(tǒng)寫法:隨著業(yè)務(wù)增長,這個方法會變成幾百行的“面條代碼”
http.authorizeHttpRequests()
    .requestMatchers("/admin/**").hasRole("ADMIN")
    .requestMatchers("/order/**").hasRole("USER")
    .requestMatchers("/pay/**").permitAll()
    // ... 無休止的追加 ...

痛點

  1. 嚴重耦合:基礎(chǔ)架構(gòu)層必須感知所有業(yè)務(wù)模塊的 URL 規(guī)則。
  2. 維護困難:多人開發(fā)時,大家都在修改同一個文件,代碼沖突不斷。
  3. 擴展性差:新增一個業(yè)務(wù)模塊,必須去改主工程的代碼。

二、 核心架構(gòu)設(shè)計

為了解決上述問題,我們引入了 “插拔式” 的設(shè)計模式。核心由三個部分組成:

  1. 調(diào)度中心:主配置類(只負責(zé)調(diào)度,不負責(zé)具體規(guī)則)。
  2. 標準協(xié)議AuthorizeRequestsCustomizer 抽象類(定義怎么配)。
  3. 業(yè)務(wù)實現(xiàn):各模塊的 Customizer(具體配什么)。

1. 調(diào)度中心:主 SecurityFilterChain

在主配置類(如 YudaoWebSecurityConfigurerAdapter)中,我們不再硬編碼規(guī)則,而是利用 Spring 的 自動注入(Dependency Injection) 特性。

// 1. 注入所有實現(xiàn)了 Customizer 接口的 Bean
@Resource
private List<AuthorizeRequestsCustomizer> authorizeRequestsCustomizers;
@Bean
protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
    httpSecurity
        // ... 其他配置 ...
        .authorizeHttpRequests(c -> {
            // 2. 核心邏輯:遍歷所有注入的 Customizer,讓它們自己定義規(guī)則
            authorizeRequestsCustomizers.forEach(customizer -> customizer.customize(c));
            // 3. 兜底規(guī)則(最后執(zhí)行)
            c.anyRequest().authenticated();
        });
    return httpSecurity.build();
}

解析:主配置類變成了一個“容器”,它根本不知道 /order 需要什么權(quán)限,它只負責(zé)把話筒交給各個業(yè)務(wù)模塊,讓模塊自己“發(fā)言”。

2. 標準協(xié)議:AuthorizeRequestsCustomizer

我們需要定義一個抽象類,既作為統(tǒng)一的接口類型,又可以提供一些通用的工具方法(如 API 前綴處理)。

public abstract class AuthorizeRequestsCustomizer
        implements Customizer<AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry>, Ordered {
    @Resource
    private WebProperties webProperties;
    // 提供通用方法的封裝,避免各模塊硬編碼前綴
    protected String buildAdminApi(String url) {
        return webProperties.getAdminApi().getPrefix() + url;
    }
    protected String buildAppApi(String url) {
        return webProperties.getAppApi().getPrefix() + url;
    }
    // 默認優(yōu)先級,業(yè)務(wù)模塊可以通過重寫此方法調(diào)整自己在過濾器鏈中的位置
    @Override
    public int getOrder() {
        return 0;
    }
}

3. 業(yè)務(wù)實現(xiàn):模塊化的 Customizer

假設(shè)我們有一個 “基礎(chǔ)設(shè)施模塊 (Infra)”,它需要開放 Swagger 文檔和一些監(jiān)控斷點,我們不需要改主工程,只需在 Infra 模塊內(nèi)部寫一個 Bean:

@Configuration
public class InfraSecurityConfiguration {
    @Bean("infraAuthorizeRequestsCustomizer")
    public AuthorizeRequestsCustomizer infraAuthorizeRequestsCustomizer() {
        return new AuthorizeRequestsCustomizer() {
            @Override
            public void customize(AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry registry) {
                // 定義該模塊獨有的權(quán)限規(guī)則
                registry.requestMatchers(buildAdminApi("/infra/file/**")).permitAll() // 文件下載免登錄
                        .requestMatchers("/swagger-ui/**").permitAll() // Swagger 免登錄
                        .requestMatchers("/druid/**").hasRole("ADMIN"); // 數(shù)據(jù)庫監(jiān)控需管理員
            }
            // 可選:如果需要在其他規(guī)則之前生效,可以調(diào)高優(yōu)先級
            @Override
            public int getOrder() {
                return -10;
            }
        };
    }
}

三、 工作原理深度解析

這個機制之所以能工作,依賴于 Spring 容器強大的生命周期管理:

  1. 啟動掃描 (Scanning)
    Spring Boot 啟動時,掃描所有加了 @Configuration 的類。
  2. Bean 注冊 (Registration)
    各個業(yè)務(wù)模塊(Infra, Order, Pay)定義的 AuthorizeRequestsCustomizer 被實例化并注冊到 Spring 容器中。
  3. 依賴收集 (Collection)
    當(dāng)初始化主配置類 YudaoWebSecurityConfigurerAdapter 時,@Resource private List<AuthorizeRequestsCustomizer> list 這行代碼會觸發(fā) Spring 去容器里查找所有類型為 AuthorizeRequestsCustomizer 的 Bean,并將它們裝進一個 List 集合中。
  4. 規(guī)則應(yīng)用 (Application)
    在構(gòu)建 SecurityFilterChain 時,代碼遍歷這個 List,依次調(diào)用 customize() 方法。
  5. 最終生效 (Finalization)
    Spring Security 將這些分散定義的規(guī)則合并成一個完整的 RequestMatcher 鏈條。

四、 優(yōu)缺點總結(jié)

優(yōu)點

  • 開閉原則 (Open/Closed Principle):對擴展開放(新增模塊只需加新 Bean),對修改關(guān)閉(無需動主配置)。
  • 高內(nèi)聚:業(yè)務(wù)模塊的權(quán)限規(guī)則寫在業(yè)務(wù)模塊內(nèi)部,代碼物理距離更近,更容易理解。
  • 靈活性:通過 Ordered 接口,可以精確控制規(guī)則的生效順序(例如:通用黑名單規(guī)則優(yōu)先級最高,普通業(yè)務(wù)規(guī)則優(yōu)先級居中,兜底規(guī)則優(yōu)先級最低)。

注意事項

  • 順序問題:Spring Security 的匹配原則是 “先匹配生效(First Match Wins)”。如果一個優(yōu)先級高的 Customizer 配置了 /** -> permitAll,那么后面所有模塊的規(guī)則都會失效。因此使用 Ordered 進行順序管理至關(guān)重要。

到此這篇關(guān)于Spring Security 進階:基于 Customizer 的分布式權(quán)限配置架構(gòu)設(shè)計的文章就介紹到這了,更多相關(guān)Spring Security Customizer分布式權(quán)限配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

佳木斯市| 金堂县| 太白县| 元氏县| 丽江市| 三河市| 新田县| 金塔县| 彩票| 宁波市| 紫阳县| 荥阳市| 改则县| 绥中县| 邵阳县| 海丰县| 大理市| 庆安县| 永安市| 松原市| 忻州市| 朔州市| 高碑店市| 光山县| 齐齐哈尔市| 澜沧| 嘉义县| 景东| 郸城县| 邵阳市| 庆阳市| 新宁县| 达拉特旗| 天津市| 邵阳市| 奉贤区| 韩城市| 波密县| 峨眉山市| 玛沁县| 曲松县|