Spring?Security過濾器鏈體系的實例詳解
以下摘自胖哥分享的 2022開工福利教程。
在學(xué)習(xí)Spring Security的時候你有沒有下面這兩個疑問:
- Spring Security的登錄是怎么配置的?
- Spring Security的訪問控制是什么機制?
SpringBootWebSecurityConfiguration
上面兩個疑問的答案就在配置類SpringBootWebSecurityConfiguration
中。你可以按照下面這個思維導(dǎo)圖去理解這個自動配置:
SpringBootWebSecurityConfiguration
為Spring Boot應(yīng)用提供了一套默認的Spring Security配置。
@Bean @Order(SecurityProperties.BASIC_AUTH_ORDER) SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic(); return http.build(); }
這里的配置為:所有的請求都必須是認證用戶發(fā)起的,同時開啟表單登錄功能以及Http Basic Authentication認證功能。 我們訪問/foo/bar
時需要登錄認證并且能夠進行表單登錄就是這個配置起作用了。這個是我們?nèi)粘i_發(fā)需要自定義的,在HttpSecurity
相關(guān)的文章中胖哥也進行了講解。這個SecurityFilterChain
到底是什么呢?
SecurityFilterChain
從上面看得出HttpSecurity
就是一個構(gòu)建類,它的使命就是構(gòu)建出一個SecurityFilterChain
:
public interface SecurityFilterChain { // 當(dāng)前請求是否匹配 boolean matches(HttpServletRequest request); // 一攬子過濾器組成的有序過濾器鏈 List<Filter> getFilters(); }
當(dāng)一個請求HttpServletRequest
進入SecurityFilterChain
時,會通過matches
方法來確定是否滿足條件進入過濾器鏈。就好比你是VIP走的是VIP通道,享受的是VIP的一系列待遇;你是普通用戶,就走普通用戶的通道并享受普通用戶的待遇。
不管用戶是哪種角色,都走的是一個過濾器鏈,一個應(yīng)用中存在1-n
個SecurityFilterChain
。那誰來管理多個SecurityFilterChain
呢?
記住這個公式HttpSecurity ->SecurityFilterChain
。
FilterChainProxy
FilterChainProxy
是一個GenericFilterBean
(即使Servlet Filter又是Spring Bean),它管理了所有注入Spring IoC容器的SecurityFilterChain
。在我剛接觸Spring Security的時候是這樣配置FilterChainProxy
的:
<bean id="myfilterChainProxy" class="org.springframework.security.web.FilterChainProxy"> <constructor-arg> <util:list> <security:filter-chain pattern="/do/not/filter*" filters="none"/> <security:filter-chain pattern="/**" filters="filter1,filter2,filter3"/> </util:list> </constructor-arg> </bean>
根據(jù)不同的請求路徑匹配走不同的SecurityFilterChain
。下面是示意圖:
后面還會對接觸這個類,現(xiàn)在你只需要明白上面這個圖就行了。
請注意:在同一過濾器鏈中不建議有多個FilterChainProxy
實例,而且不應(yīng)將其作為單純的過濾器使用,它只應(yīng)該承擔(dān)管理SecurityFilterChain
的功能。
DelegatingFilterProxy
Servlet 容器和Spring IoC容器之間的Filter生命周期并不匹配。為了讓Spring IoC容器管理Filter的生命周期,FilterChainProxy
便交由Spring Web下的DelegatingFilterProxy
來代理。而且FilterChainProxy
不會在添加到應(yīng)用程序上下文的任何過濾器Bean上調(diào)用標(biāo)準(zhǔn)Servlet過濾器生命周期方法,FilterChainProxy
的生命周期方法會委托給DelegatingFilterProxy
來執(zhí)行。而DelegatingFilterProxy
作為Spring IoC和Servlet的連接器存在。
簡單總結(jié)
上面的三個概念非常重要,涉及到Spring Security的整個過濾器鏈體系。但是作為初學(xué)者來說,能看懂多少就看懂多少,不要糾結(jié)哪些沒有理解,因為目前學(xué)習(xí)階段的層次達不到是非常正常的。但是等你學(xué)完了Spring Security之后,這幾個概念一定要搞明白。
到此這篇關(guān)于Spring Security過濾器鏈體系的文章就介紹到這了,更多相關(guān)Spring Security過濾器鏈體系內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring?boot?validation參數(shù)校驗與分組嵌套各種類型及使用小結(jié)
參數(shù)校驗基本上是controller必做的事情,畢竟前端傳過來的一切都不可信,validation可以簡化這一操作,這篇文章主要介紹了spring?boot?validation參數(shù)校驗分組嵌套各種類型及使用小結(jié),需要的朋友可以參考下2023-09-09mybatis-plus實現(xiàn)自定義SQL、多表查詢與多表分頁查詢語句實例
mybatisplus是個很好用的插件,相信小伙伴們都知道,下面這篇文章主要給大家介紹了關(guān)于mybatis-plus實現(xiàn)自定義SQL、多表查詢與多表分頁查詢語句的相關(guān)資料,需要的朋友可以參考下2022-09-09SpringBoot+MinIO實現(xiàn)文件切片極速詳解
在現(xiàn)代Web應(yīng)用中,文件上傳是一個常見的需求,尤其是對于大文件的上傳,如視頻、音頻或大型文檔,所以本文就來為大家介紹一下如何使用Spring Boot和MinIO實現(xiàn)文件切片極速上傳技術(shù)吧2023-12-12java 內(nèi)部類(匿名類,匿名對象,靜態(tài)內(nèi)部類)詳解及實例
這篇文章主要介紹了java 內(nèi)部類詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下2016-12-12