以下摘自胖哥分享的 2022開工福利教程,
在學習Spring Security的時候你有沒有下面這兩個疑問:
- Spring Security的登錄是怎么配置的?
- Spring Security的訪問控制是什么機制?
SpringBootWebSecurityConfiguration
上面兩個疑問的答案就在配置類SpringBootWebSecurityConfiguration中,你可以按照下面這個思維導圖去理解這個自動配置:

SpringBootWebSecurityConfiguration為Spring Boot應用提供了一套默認的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();
}
這里的配置為:所有的請求都必須是認證用戶發起的,同時開啟表單登錄功能以及Http Basic Authentication認證功能, 我們訪問/foo/bar時需要登錄認證并且能夠進行表單登錄就是這個配置起作用了,這個是我們日常開發需要自定義的,在HttpSecurity相關的文章中胖哥也進行了講解,這個SecurityFilterChain到底是什么呢?
SecurityFilterChain
從上面看得出HttpSecurity就是一個構建類,它的使命就是構建出一個SecurityFilterChain:
public interface SecurityFilterChain {
// 當前請求是否匹配
boolean matches(HttpServletRequest request);
// 一攬子過濾器組成的有序過濾器鏈
List<Filter> getFilters();
}
當一個請求HttpServletRequest進入SecurityFilterChain時,會通過matches方法來確定是否滿足條件進入過濾器鏈,就好比你是VIP走的是VIP通道,享受的是VIP的一系列待遇;你是普通用戶,就走普通用戶的通道并享受普通用戶的待遇,

不管用戶是哪種角色,都走的是一個過濾器鏈,一個應用中存在1-n個SecurityFilterChain,那誰來管理多個SecurityFilterChain呢?
記住這個公式
HttpSecurity ->SecurityFilterChain,
FilterChainProxy
FilterChainProxy是一個GenericFilterBean(即使Servlet Filter又是Spring Bean),它管理了所有注入Spring IoC容器的SecurityFilterChain,在我剛接觸Spring Security的時候是這樣配置FilterChainProxy的:
<bean id="myfilterChainProxy" >
<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>
根據不同的請求路徑匹配走不同的SecurityFilterChain,下面是示意圖:

后面還會對接觸這個類,現在你只需要明白上面這個圖就行了,
請注意:在同一過濾器鏈中不建議有多個
FilterChainProxy實體,而且不應將其作為單純的過濾器使用,它只應該承擔管理SecurityFilterChain的功能,
DelegatingFilterProxy
Servlet 容器和Spring IoC容器之間的Filter生命周期并不匹配,為了讓Spring IoC容器管理Filter的生命周期,FilterChainProxy便交由Spring Web下的DelegatingFilterProxy來代理,而且FilterChainProxy不會在添加到應用程式背景關系的任何過濾器Bean上呼叫標準Servlet過濾器生命周期方法,FilterChainProxy的生命周期方法會委托給DelegatingFilterProxy來執行,而DelegatingFilterProxy作為Spring IoC和Servlet的連接器存在,

簡單總結
上面的三個概念非常重要,涉及到Spring Security的整個過濾器鏈體系,但是作為初學者來說,能看懂多少就看懂多少,不要糾結哪些沒有理解,因為目前學習階段的層次達不到是非常正常的,但是等你學完了Spring Security之后,這幾個概念一定要搞明白,
關注公眾號:Felordcn 獲取更多資訊
個人博客:https://felord.cn
|
博主:碼農小胖哥 出處:felord.cn 本文著作權歸原作者所有,不可商用,轉載需要宣告出處,否則保留追究法律責任的權利,如果文中有什么錯誤,歡迎指出,以免更多的人被誤導, |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/423629.html
標籤:其他
