SpringBoot企業級整合SpringSecurity(WEB+APP+授權)

程式設計師勸退師-TAO發表於2020-10-06

SpringSecurity核心功能

1.認證(你是誰)
2.授權(你能幹什麼)
3.攻擊防護(防止偽造身份)

在這裡插入圖片描述
這張是SpringSecurity的基本原理圖,最右邊的就是我們controller介面,前面的大框框就是我們的過濾器,SpringSecurity就是一組過濾器,他的核心也就是這樣一條過濾鏈,訪問的所有請求都會經過SpringSecurity的過濾器,同樣相應也會從過濾器中返回,這些過濾器SpringBoot啟動的時候就會把這些過濾器配置進去

UsernamePasswordAuthenticationFilter-BasicAuthenticationFilter
這個過濾器鏈上有很多的過濾器,這裡面第一個和第二個是過濾器中比較核心的,他們的作用就是用來校驗使用者的身份,每一個綠色的方塊都代表一個過濾器, 每一個過濾器負責處理一種認證方式,比如基本的http.formLogin()、對應著UsernamePasswordAuthenticationFilter過濾器、http.httpBasic()就對應BasicAuthenticationFilter過濾器,
在這裡插入圖片描述
那麼在請求到達相關的綠色過濾器時,如http.formLogin()-UsernamePasswordAuthenticationFilter這個過濾器時,就會觸發檢查當前請求是否是一個登陸請求,在判斷請求中是否攜帶使用者名稱-密碼,若是符合這些條件,那麼這個過濾器就會試圖去登入,若是當前請求不滿足這些條件,那麼就會放過當前請求,下發給下一個過濾器,那麼如上圖整個過濾器鏈上UsernamePasswordAuthenticationFilter的下一個過濾器是BasicAuthenticationFilter,那麼當請求到達BasicAuthenticationFilter過濾器後又會判斷觸發當前過濾器的條件,如請求頭中是否攜帶Basic登入的相關資訊,如果有的話就會嘗試Bash64 解碼,嘗試登入,如果還有一些其他的自定義過濾器的話也是這樣的邏輯,按照這個流程他會一步一步往下走,如果在某個過濾器上認證成功後會在請求上做一個標記,用來標識當前這個請求的使用者授權成功了 。
在這裡插入圖片描述
這裡的原始碼也就是判斷請求路徑中是否為login,請求方式為POST,如果符合這個條件就會在下面開始嘗試登入

FilterSecurityInterceptor
請求經過綠色的過濾器後來到橙色的FilterSecurityInterceptor這樣的一個過濾器上,這個過濾器是整個SpringSecurity過濾器鏈上的最後一環,他是最終的守門人,在他後面就是我們的Controller API介面服務了,在這個過濾器裡面他能夠決定請求能不能訪問API請求,他是根據我們程式碼裡面的配置邏輯來的,也就是上面程式碼中.add()中新增的相關配置。
在這裡插入圖片描述

ExceptionTranslationFilter
如果這個過濾器驗證身份沒過就會丟擲異常, 在這個異常丟擲來的前面會有一個ExceptionTranslationFilter來捕獲後面這個過濾器丟擲的異常,這個異常捕獲過濾器會根據丟擲的異常做相應的處理,會根據前面的表單過濾器,或者Basic過濾器引導到對應的登入方式上面,SpringSecurity提供的所有功能特性都是建立在這個過濾器鏈的基礎上的,比如驗證碼登入,第三方微信登入,QQ登入,實際上就是在這個過濾器鏈上加這種綠色的過濾器來支援不同的認證方式,在實際的程式執行的時候,過濾器鏈上的過濾器不止這幾種,還有很多的其他過濾器,文章後面會詳細介紹其他的過濾器!在過濾器鏈上綠色的過濾器部分我們是可以通過配置決定某個過濾器是否生效的,
在這裡插入圖片描述

注意
除了綠色的以外,其他的過濾器我們都是不能控制的,他們都是在過濾器鏈上,而且一定是會在SpringSecurity事先指定的過濾器鏈上的順序位置,比如藍色的異常過濾器一定會在橙色的過濾器之前,這個位置我們是不能取更改的,也不能從SpringSecurity的過濾器鏈上去掉。

相關文章