Spring?Security過濾器鏈體系的實(shí)例詳解
以下摘自胖哥分享的 2022開工福利教程。
在學(xué)習(xí)Spring Security的時(shí)候你有沒有下面這兩個(gè)疑問:
- Spring Security的登錄是怎么配置的?
- Spring Security的訪問控制是什么機(jī)制?
SpringBootWebSecurityConfiguration
上面兩個(gè)疑問的答案就在配置類SpringBootWebSecurityConfiguration
中。你可以按照下面這個(gè)思維導(dǎo)圖去理解這個(gè)自動配置:
SpringBootWebSecurityConfiguration
為Spring Boot應(yīng)用提供了一套默認(rèn)的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(); }
這里的配置為:所有的請求都必須是認(rèn)證用戶發(fā)起的,同時(shí)開啟表單登錄功能以及Http Basic Authentication認(rèn)證功能。 我們訪問/foo/bar
時(shí)需要登錄認(rèn)證并且能夠進(jìn)行表單登錄就是這個(gè)配置起作用了。這個(gè)是我們?nèi)粘i_發(fā)需要自定義的,在HttpSecurity
相關(guān)的文章中胖哥也進(jìn)行了講解。這個(gè)SecurityFilterChain
到底是什么呢?
SecurityFilterChain
從上面看得出HttpSecurity
就是一個(gè)構(gòu)建類,它的使命就是構(gòu)建出一個(gè)SecurityFilterChain
:
public interface SecurityFilterChain { // 當(dāng)前請求是否匹配 boolean matches(HttpServletRequest request); // 一攬子過濾器組成的有序過濾器鏈 List<Filter> getFilters(); }
當(dāng)一個(gè)請求HttpServletRequest
進(jìn)入SecurityFilterChain
時(shí),會通過matches
方法來確定是否滿足條件進(jìn)入過濾器鏈。就好比你是VIP走的是VIP通道,享受的是VIP的一系列待遇;你是普通用戶,就走普通用戶的通道并享受普通用戶的待遇。
不管用戶是哪種角色,都走的是一個(gè)過濾器鏈,一個(gè)應(yīng)用中存在1-n
個(gè)SecurityFilterChain
。那誰來管理多個(gè)SecurityFilterChain
呢?
記住這個(gè)公式HttpSecurity ->SecurityFilterChain
。
FilterChainProxy
FilterChainProxy
是一個(gè)GenericFilterBean
(即使Servlet Filter又是Spring Bean),它管理了所有注入Spring IoC容器的SecurityFilterChain
。在我剛接觸Spring Security的時(shí)候是這樣配置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
。下面是示意圖:
后面還會對接觸這個(gè)類,現(xiàn)在你只需要明白上面這個(gè)圖就行了。
請注意:在同一過濾器鏈中不建議有多個(gè)FilterChainProxy
實(shí)例,而且不應(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é)
上面的三個(gè)概念非常重要,涉及到Spring Security的整個(gè)過濾器鏈體系。但是作為初學(xué)者來說,能看懂多少就看懂多少,不要糾結(jié)哪些沒有理解,因?yàn)槟壳皩W(xué)習(xí)階段的層次達(dá)不到是非常正常的。但是等你學(xué)完了Spring Security之后,這幾個(gè)概念一定要搞明白。
到此這篇關(guān)于Spring Security過濾器鏈體系的文章就介紹到這了,更多相關(guān)Spring Security過濾器鏈體系內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring?boot?validation參數(shù)校驗(yàn)與分組嵌套各種類型及使用小結(jié)
參數(shù)校驗(yàn)基本上是controller必做的事情,畢竟前端傳過來的一切都不可信,validation可以簡化這一操作,這篇文章主要介紹了spring?boot?validation參數(shù)校驗(yàn)分組嵌套各種類型及使用小結(jié),需要的朋友可以參考下2023-09-09spring框架集成flyway項(xiàng)目的詳細(xì)過程
今天通過本文給大家分享spring框架集成flyway項(xiàng)目的詳細(xì)過程,由于大多數(shù)都是springboot集成flyway,很少見到spring框架的項(xiàng)目,今天就抽空給大家介紹下spring框架集成flyway項(xiàng)目的方法,一起看看吧2021-07-07SpringBoot如何IDEA中實(shí)現(xiàn)熱部署
這篇文章主要介紹了SpringBoot如何IDEA中實(shí)現(xiàn)熱部署,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04mybatis-plus實(shí)現(xiàn)自定義SQL、多表查詢與多表分頁查詢語句實(shí)例
mybatisplus是個(gè)很好用的插件,相信小伙伴們都知道,下面這篇文章主要給大家介紹了關(guān)于mybatis-plus實(shí)現(xiàn)自定義SQL、多表查詢與多表分頁查詢語句的相關(guān)資料,需要的朋友可以參考下2022-09-09SpringBoot+MinIO實(shí)現(xiàn)文件切片極速詳解
在現(xiàn)代Web應(yīng)用中,文件上傳是一個(gè)常見的需求,尤其是對于大文件的上傳,如視頻、音頻或大型文檔,所以本文就來為大家介紹一下如何使用Spring Boot和MinIO實(shí)現(xiàn)文件切片極速上傳技術(shù)吧2023-12-12java 內(nèi)部類(匿名類,匿名對象,靜態(tài)內(nèi)部類)詳解及實(shí)例
這篇文章主要介紹了java 內(nèi)部類詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-12-12