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

最新版Spring Security中的路徑匹配方案

 更新時間:2024年04月22日 11:49:45   作者:江南一點雨  
在 Spring Security 中,路徑匹配是權(quán)限控制的核心部分,它決定了哪些請求可以訪問特定的資源,本文將詳細介紹 Spring Security 中的路徑匹配策略,并提供相應(yīng)的代碼示例,需要的朋友可以參考下

Spring Security 是一個功能強大且可高度定制的安全框架,它提供了一套完整的解決方案,用于保護基于 Spring 的應(yīng)用程序。在 Spring Security 中,路徑匹配是權(quán)限控制的核心部分,它決定了哪些請求可以訪問特定的資源。本文將詳細介紹 Spring Security 中的路徑匹配策略,并提供相應(yīng)的代碼示例。

在舊版的 Spring Security 中,路徑匹配方法有很多,但是新版 Spring Security 對這些方法進行了統(tǒng)一的封裝,都是調(diào)用 requestMatchers 方法進行處理:

public C requestMatchers(RequestMatcher... requestMatchers) {
	Assert.state(!this.anyRequestConfigured, "Can't configure requestMatchers after anyRequest");
	return chainRequestMatchers(Arrays.asList(requestMatchers));
}

requestMatchers 方法接收一個 RequestMatcher 類型的參數(shù),RequestMatcher 是一個接口,這個接口是一個用來確定 HTTP 請求是否與給定的模式匹配的工具。這個接口提供了一種靈活的方式來定義請求的匹配規(guī)則,從而可以對不同的請求執(zhí)行不同的安全策略。

所以在新版 Spring Security 中,不同的路徑匹配分方案實際上就是不同的 RequestMatcher 的實現(xiàn)類。

1. AntPathRequestMatcher

AntPathRequestMatcher 是 Spring 中最常用的請求匹配器之一,它使用 Ant 風(fēng)格的路徑模式來匹配請求的 URI。

1.1 什么是 Ant 風(fēng)格的路徑模式

Ant 風(fēng)格的路徑模式(Ant Path Matching)是一種用于資源定位的模式匹配規(guī)則,它源自 Apache Ant 這個 Java 構(gòu)建工具。在 Ant 中,這種模式被用來指定文件系統(tǒng)中的文件和目錄。由于其簡單性和靈活性,Ant 風(fēng)格的路徑模式也被其他許多框架和應(yīng)用程序所采用,包括 Spring Security。

Ant 風(fēng)格的路徑模式使用了一些特殊的字符來表示不同級別的路徑匹配:

  • ?:匹配任何單個字符(除了路徑分隔符)。

  • *:匹配任何字符的序列(除了路徑分隔符),但不包括空字符串。

  • **:匹配任何字符的序列,包括空字符串。至少匹配一個字符的序列,并且可以跨越路徑分隔符。

  • {}:表示一個通配符的選擇,可以匹配多個逗號分隔的模式。例如,{,春夏秋冬} 可以匹配任何以春夏秋冬開頭的字符串。

  • []:在某些實現(xiàn)中,可以用于匹配括號內(nèi)的單個字符。

  • ():在某些實現(xiàn)中,可以用于分組匹配。

在 Spring Security 中,Ant 風(fēng)格的路徑模式通常用于定義 URL 路徑和安全配置之間的映射關(guān)系。例如,你可以使用 Ant 風(fēng)格的路徑模式來指定哪些 URL 路徑需要特定的權(quán)限或角色。

以下是一些 Ant 風(fēng)格路徑模式的例子:

  • /users/*:匹配以 /users/ 開始的任何路徑,如 /users/123/users/profile。

  • /users/**:匹配以 /users/ 開始的任何路徑,包括子路徑,如 /users/123/users/profile/picture.

  • /users/123:精確匹配 /users/123

  • /users/{id}:雖然這不是 Ant 風(fēng)格的模式,但它展示了路徑參數(shù)匹配,可以匹配 /users/123、/users/456 等。

  • /files/**.{jpg,png}:匹配 /files/ 下所有以 .jpg.png 結(jié)尾的文件路徑,如 /files/image1.jpg/files/folder/image.png。

通過使用 Ant 風(fēng)格的路徑模式,你可以靈活地定義復(fù)雜的 URL 匹配規(guī)則,以適應(yīng)不同的安全需求。

1.2 基本用法

import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

// 創(chuàng)建 AntPathRequestMatcher 實例
RequestMatcher antMatcher = new AntPathRequestMatcher("/users/**", "GET");

// 使用 matcher 進行匹配
boolean isMatch = antMatcher.matches(request);

1.3 通配符

  • ? 匹配任何單字符。
  • * 匹配任何字符序列(但不包括目錄分隔符)。
  • ** 匹配任何字符序列,包括目錄分隔符。
// 匹配 /admin 下的任何資源,包括子目錄
RequestMatcher adminMatcher = new AntPathRequestMatcher("/admin/**");

// 匹配 /files 目錄下的任何 HTML 文件
RequestMatcher fileMatcher = new AntPathRequestMatcher("/files/*.{html,htm}", "GET");

2. RegexRequestMatcher

RegexRequestMatcher 使用正則表達式來匹配請求的 URI 和 HTTP 方法。

2.1 基本用法

import org.springframework.security.web.util.matcher.RegexRequestMatcher;

// 創(chuàng)建 RegexRequestMatcher 實例
RequestMatcher regexMatcher = new RegexRequestMatcher("^/api/.*", "GET");

// 使用 matcher 進行匹配
boolean isMatch = regexMatcher.matches(request);

2.2 使用正則表達式

// 匹配任何以 /api 開頭的 URI
RequestMatcher apiMatcher = new RegexRequestMatcher("^/api/.*");

// 匹配任何 HTTP 方法
RequestMatcher anyMethodMatcher = new RegexRequestMatcher("^/.*", "GET|POST|PUT|DELETE");

2.3 結(jié)合 Spring Security

下面這段代碼,表示攔截所有以 html、css 以及 js 結(jié)尾的請求,這些請求可以直接訪問:

@Configuration
public class SecurityConfig {

    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(a -> a.requestMatchers(new RegexRequestMatcher("^.*\\.(htm|css|js)$","GET")).permitAll())
                .formLogin(Customizer.withDefaults())
                .csrf(c -> c.disable());
        return http.build();
    }
}

3. RequestHeaderRequestMatcher

RequestHeaderRequestMatcher 用來匹配請求頭中的鍵和值。

import org.springframework.security.web.util.matcher.RequestHeaderRequestMatcher;

// 創(chuàng)建 RequestHeaderRequestMatcher 實例
RequestMatcher headerMatcher = new RequestHeaderRequestMatcher("User-Agent", "Mozilla.*");

// 使用 matcher 進行匹配
boolean isMatch = headerMatcher.matches(request);

具體到 Spring Security 中,用法如下:

@Configuration
public class SecurityConfig {

    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(a -> a.requestMatchers(new RequestHeaderRequestMatcher("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36")).permitAll())
                .formLogin(Customizer.withDefaults())
                .csrf(c -> c.disable());
        return http.build();
    }
}

4. NegatedRequestMatcher

NegatedRequestMatcher 允許你否定一個已有的 RequestMatcher 的匹配結(jié)果。

import org.springframework.security.web.util.matcher.NegatedRequestMatcher;

// 創(chuàng)建一個 matcher,然后否定它的匹配結(jié)果
RequestMatcher notAdminMatcher = new NegatedRequestMatcher(adminMatcher);

// 使用 negated matcher 進行匹配
boolean isNotMatch = notAdminMatcher.matches(request);

例如下面這段代碼表示除了 /hello 之外的地址,全都可以直接訪問:

@Configuration
public class SecurityConfig {

    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(a -> a.requestMatchers(new NegatedRequestMatcher(new AntPathRequestMatcher("/hello"))).permitAll())
                .formLogin(Customizer.withDefaults())
                .csrf(c -> c.disable());
        return http.build();
    }
}

5. AndRequestMatcher 和 OrRequestMatcher

AndRequestMatcherOrRequestMatcher 分別用來組合多個 RequestMatcher 實例,進行“與”或“或”的邏輯匹配。

5.1 AndRequestMatcher

import org.springframework.security.web.util.matcher.AndRequestMatcher;

// 組合多個 matcher 進行“與”匹配
RequestMatcher andMatcher = new AndRequestMatcher(apiMatcher, headerMatcher);

// 使用 andMatcher 進行匹配
boolean isMatch = andMatcher.matches(request);

5.2 OrRequestMatcher

import org.springframework.security.web.util.matcher.OrRequestMatcher;

// 組合多個 matcher 進行“或”匹配
RequestMatcher orMatcher = new OrRequestMatcher(adminMatcher, fileMatcher);

// 使用 orMatcher 進行匹配
boolean isMatch = orMatcher.matches(request);

6. 總結(jié)

Spring 提供了多種 RequestMatcher 實現(xiàn)類,以滿足不同的請求匹配需求。通過合理地使用這些匹配器,可以靈活地定義和實施安全策略。在實際應(yīng)用中,你可能需要根據(jù)業(yè)務(wù)需求選擇合適的匹配器,并結(jié)合 Spring Security 的配置來實現(xiàn)細粒度的訪問控制。

以上就是最新版Spring Security中的路徑匹配方案的詳細內(nèi)容,更多關(guān)于Spring Security路徑匹配的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • idea使用spring Initializr 快速搭建springboot項目遇到的坑

    idea使用spring Initializr 快速搭建springboot項目遇到的坑

    這篇文章主要介紹了idea使用spring Initializr 快速搭建springboot項目遇到的坑,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Java圖形界面之JFrame,JLabel,JButton詳解

    Java圖形界面之JFrame,JLabel,JButton詳解

    這篇文章主要介紹了Java圖形界面之JFrame、JLabel、JButton詳解,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Spring Boot項目中結(jié)合MyBatis實現(xiàn)MySQL的自動主從切換功能

    Spring Boot項目中結(jié)合MyBatis實現(xiàn)MySQL的自動主從切換功能

    這篇文章主要介紹了Spring Boot項目中結(jié)合MyBatis實現(xiàn)MySQL的自動主從切換功能,本文分步驟給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-04-04
  • 關(guān)于ScheduledThreadPoolExecutor不執(zhí)行的原因分析

    關(guān)于ScheduledThreadPoolExecutor不執(zhí)行的原因分析

    這篇文章主要介紹了關(guān)于ScheduledThreadPoolExecutor不執(zhí)行的原因分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • SpringBoot全局異常攔截與自定義錯誤頁面實現(xiàn)過程解讀

    SpringBoot全局異常攔截與自定義錯誤頁面實現(xiàn)過程解讀

    本文介紹了SpringBoot中全局異常攔截與自定義錯誤頁面的實現(xiàn)方法,包括異常的分類、SpringBoot默認異常處理機制、全局異常攔截實現(xiàn)、自定義錯誤頁面實現(xiàn)以及兩者的結(jié)合使用,通過這些技術(shù),可以提高系統(tǒng)的穩(wěn)定性和用戶體驗
    2025-12-12
  • Mybatis的mapper文件中#和$的區(qū)別示例解析

    Mybatis的mapper文件中#和$的區(qū)別示例解析

    MyBatis的mapper文件中,#{}和${}是兩種參數(shù)占位符,核心差異在于參數(shù)解析方式、SQL 注入風(fēng)險、適用場景,以下從底層原理、使用場景、示例等維度詳細解析,本文介紹Mybatis的mapper文件中#和$的區(qū)別,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • SpringBoot重啟后,第一次請求接口請求慢的問題及解決

    SpringBoot重啟后,第一次請求接口請求慢的問題及解決

    這篇文章主要介紹了SpringBoot重啟后,第一次請求接口請求慢的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • java整合微信支付功能詳細示例

    java整合微信支付功能詳細示例

    這篇文章主要給大家介紹了關(guān)于java整合微信支付功能的相關(guān)資料,支付是一個復(fù)雜且測試起來需要的配置特別復(fù)雜的模塊,文中給出了詳細的示例代碼,需要的朋友可以參考下
    2023-07-07
  • 4種java復(fù)制文件的方式

    4種java復(fù)制文件的方式

    本篇文章列舉了4種最受歡迎的java復(fù)制文件的方式,復(fù)制文件是一個重要的操作,需要的朋友可以參考下
    2015-07-07
  • 在本地用idea連接虛擬機上的hbase集群的實現(xiàn)代碼

    在本地用idea連接虛擬機上的hbase集群的實現(xiàn)代碼

    這篇文章主要介紹了在本地用idea連接虛擬機上的hbase集群的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10

最新評論

德阳市| 凌源市| 安龙县| 凌云县| 西平县| 南充市| 嵩明县| 且末县| 天水市| 泗阳县| 额尔古纳市| 南通市| 通辽市| 同江市| 刚察县| 双柏县| 广汉市| 汕头市| 大田县| 海淀区| 武定县| 盘山县| 荥经县| 灵石县| 自贡市| 庆阳市| 淅川县| 桂阳县| 东方市| 岫岩| 双鸭山市| 城口县| 峨眉山市| 江华| 怀安县| 镇赉县| 汪清县| 靖安县| 临沭县| 乌兰浩特市| 蚌埠市|