責(zé)任鏈模式在spring security過(guò)濾器鏈中的應(yīng)用小結(jié)
責(zé)任鏈模式(Chain of Responsibility Pattern)是一種行為型設(shè)計(jì)模式,它允許多個(gè)對(duì)象按照順序處理請(qǐng)求,并且每個(gè)對(duì)象可以選擇自己是否處理該請(qǐng)求或?qū)⑵鋫鬟f給下一個(gè)對(duì)象。
在Spring Security中,責(zé)任鏈模式得到了廣泛應(yīng)用,特別是在其過(guò)濾器鏈(Filter Chain)機(jī)制中。
一、Spring Security過(guò)濾器鏈概述
Spring Security中的過(guò)濾器鏈?zhǔn)潜Wo(hù)Web應(yīng)用程序的核心組件之一。它是一條由多個(gè)過(guò)濾器組成的序列,這些過(guò)濾器按照特定順序執(zhí)行,用于處理HTTP請(qǐng)求和響應(yīng)。每當(dāng)客戶(hù)端向應(yīng)用程序發(fā)送請(qǐng)求時(shí),請(qǐng)求首先會(huì)經(jīng)過(guò)Spring Security的過(guò)濾器鏈。過(guò)濾器鏈中的過(guò)濾器會(huì)按順序執(zhí)行,每個(gè)過(guò)濾器都有機(jī)會(huì)處理請(qǐng)求和響應(yīng)。如果過(guò)濾器允許請(qǐng)求繼續(xù),則請(qǐng)求會(huì)被轉(zhuǎn)發(fā)到下一個(gè)過(guò)濾器或最終到達(dá)應(yīng)用程序的控制器。
二、責(zé)任鏈模式在過(guò)濾器鏈中的應(yīng)用
- 過(guò)濾器鏈的構(gòu)成:
- Spring Security的過(guò)濾器鏈包含多種過(guò)濾器,如:
UsernamePasswordAuthenticationFilter
(用于處理基于用戶(hù)名和密碼的身份驗(yàn)證)、AbstractAuthenticationProcessingFilter
(抽象類(lèi),是大多數(shù)身份驗(yàn)證過(guò)濾器的基類(lèi))、SecurityContextPersistenceFilter
(負(fù)責(zé)加載和保存SecurityContext)、RememberMeAuthenticationFilter
(處理基于“記住我”功能的身份驗(yàn)證)、CsrfFilter
(處理跨站請(qǐng)求偽造保護(hù))以及FilterSecurityInterceptor
(執(zhí)行訪(fǎng)問(wèn)決策)等。
- Spring Security的過(guò)濾器鏈包含多種過(guò)濾器,如:
- 責(zé)任鏈模式的實(shí)現(xiàn):
- 在Spring Security中,每個(gè)過(guò)濾器都實(shí)現(xiàn)了特定的安全功能,并且它們按照配置的順序串聯(lián)在一起,形成了一個(gè)過(guò)濾器鏈。
- 當(dāng)請(qǐng)求到達(dá)時(shí),它首先被傳遞給鏈中的第一個(gè)過(guò)濾器。該過(guò)濾器會(huì)根據(jù)其邏輯判斷是否需要處理該請(qǐng)求。如果需要,則進(jìn)行處理;如果不需要或處理完成后需要繼續(xù)傳遞,則將該請(qǐng)求傳遞給鏈中的下一個(gè)過(guò)濾器。
- 這種機(jī)制允許每個(gè)過(guò)濾器專(zhuān)注于自己的安全功能,而無(wú)需關(guān)心其他過(guò)濾器的實(shí)現(xiàn)細(xì)節(jié)。同時(shí),它也提供了更大的靈活性和可擴(kuò)展性,因?yàn)榭梢酝ㄟ^(guò)添加、刪除或重新排序過(guò)濾器來(lái)輕松地修改安全策略。
- 關(guān)鍵過(guò)濾器的功能:
UsernamePasswordAuthenticationFilter
:用于處理基于用戶(hù)名和密碼的身份驗(yàn)證。它通常處理POST請(qǐng)求到/login端點(diǎn)。SecurityContextPersistenceFilter
:負(fù)責(zé)加載和保存SecurityContext。SecurityContext包含當(dāng)前用戶(hù)的安全上下文,如已認(rèn)證的用戶(hù)主體。FilterSecurityInterceptor
:執(zhí)行訪(fǎng)問(wèn)決策。它根據(jù)配置的AccessDecisionManager
和AccessDecisionVoter
來(lái)決定用戶(hù)是否有權(quán)訪(fǎng)問(wèn)某個(gè)資源。
三、自定義過(guò)濾器
在Spring Security中,自定義過(guò)濾器的實(shí)現(xiàn)是責(zé)任鏈模式的一個(gè)典型應(yīng)用。通過(guò)創(chuàng)建并注冊(cè)自定義過(guò)濾器,你可以將特定的安全邏輯插入到過(guò)濾器鏈中,從而在請(qǐng)求處理過(guò)程中執(zhí)行額外的操作。
以下是一個(gè)簡(jiǎn)單的示例,展示如何創(chuàng)建自定義過(guò)濾器并將其集成到Spring Security的過(guò)濾器鏈中。
假設(shè)我們需要?jiǎng)?chuàng)建一個(gè)自定義過(guò)濾器,用于記錄每個(gè)請(qǐng)求的URI和HTTP方法。以下是如何實(shí)現(xiàn)這個(gè)自定義過(guò)濾器并將其添加到Spring Security的過(guò)濾器鏈中的步驟。
創(chuàng)建自定義過(guò)濾器
首先,你需要?jiǎng)?chuàng)建一個(gè)實(shí)現(xiàn)javax.servlet.Filter
接口的類(lèi)。在這個(gè)類(lèi)中,你將覆蓋doFilter
方法以執(zhí)行你的自定義邏輯。
import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.Filter; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import java.io.IOException; public class CustomLoggingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化邏輯(可選) } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String uri = httpRequest.getRequestURI(); String method = httpRequest.getMethod(); // 記錄請(qǐng)求的URI和HTTP方法 System.out.println("Request URI: " + uri + ", Method: " + method); // 將請(qǐng)求傳遞給過(guò)濾器鏈中的下一個(gè)過(guò)濾器 chain.doFilter(request, response); } @Override public void destroy() { // 銷(xiāo)毀邏輯(可選) } }
注冊(cè)自定義過(guò)濾器到Spring Security
接下來(lái),你需要將自定義過(guò)濾器注冊(cè)到Spring Security的過(guò)濾器鏈中。這通常是通過(guò)配置類(lèi)來(lái)實(shí)現(xiàn)的。
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .addFilterBefore(customLoggingFilter(), UsernamePasswordAuthenticationFilter.class) // 其他安全配置... .authorizeRequests() .anyRequest().authenticated() .and() .formLogin() // 如果使用表單登錄,則啟用它 .and() .httpBasic(); // 啟用HTTP Basic(可選) return http.build(); } @Bean public CustomLoggingFilter customLoggingFilter() { return new CustomLoggingFilter(); } }
在這個(gè)配置類(lèi)中,我們使用了HttpSecurity
來(lái)配置Spring Security。通過(guò)調(diào)用addFilterBefore
方法,我們將自定義過(guò)濾器CustomLoggingFilter
添加到了UsernamePasswordAuthenticationFilter
之前。這意味著在身份驗(yàn)證之前,我們的自定義過(guò)濾器將首先執(zhí)行并記錄請(qǐng)求的URI和HTTP方法。
運(yùn)行應(yīng)用程序
現(xiàn)在,當(dāng)你運(yùn)行應(yīng)用程序并發(fā)送請(qǐng)求時(shí),你應(yīng)該會(huì)在控制臺(tái)中看到自定義過(guò)濾器記錄的請(qǐng)求信息。
在Spring Security中每個(gè)過(guò)濾器(包括自定義過(guò)濾器)都是鏈中的一個(gè)節(jié)點(diǎn),它們按照配置的順序依次執(zhí)行。每個(gè)過(guò)濾器都有機(jī)會(huì)處理請(qǐng)求,并且可以選擇將請(qǐng)求傳遞給鏈中的下一個(gè)過(guò)濾器或執(zhí)行其他操作(如拒絕訪(fǎng)問(wèn)、重定向等)。這種機(jī)制使得Spring Security能夠靈活地處理各種安全需求,同時(shí)保持了代碼的清晰和可維護(hù)性。
到此這篇關(guān)于責(zé)任鏈模式在spring security過(guò)濾器鏈中的應(yīng)用的文章就介紹到這了,更多相關(guān)spring security過(guò)濾器鏈內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
feign遠(yuǎn)程調(diào)用無(wú)法傳遞對(duì)象屬性405的問(wèn)題
這篇文章主要介紹了feign遠(yuǎn)程調(diào)用無(wú)法傳遞對(duì)象屬性405的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Spring?BeanFactory容器的構(gòu)建和使用示例詳解
BeanFactory是Spring框架中的一部分,它提供了IoC(控制反轉(zhuǎn))的實(shí)現(xiàn)機(jī)制,下面小編就來(lái)和大家簡(jiǎn)單聊聊BeanFactory容器的構(gòu)建和使用示例吧2023-07-07詳解如何將已有項(xiàng)目改造為Spring Boot項(xiàng)目
本篇文章主要介紹了如何將已有項(xiàng)目改造為Spring Boot項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11@ConfigurationProperties加載外部配置方式
這篇文章主要介紹了@ConfigurationProperties加載外部配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Java使用lambda表達(dá)式簡(jiǎn)化代碼的示例詳解
這篇文章主要給大家介紹了Java如何使用lambda表達(dá)式簡(jiǎn)化代碼的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-11-11Java三種獲取redis的連接及redis_String類(lèi)型演示(適合新手)
這篇文章主要介紹了Java三種獲取redis的連接及redis_String類(lèi)型演示(適合新手),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12