今天跟大家聊聊 Spring Security 的前世今生
最近有小伙伴問(wèn)我 Spring Security 相關(guān)知識(shí),索性我就寫(xiě)點(diǎn)這方面的文章給大家,希望大家看了會(huì)有點(diǎn)收獲。
前世今生
Spring Security的前身并非稱(chēng)呼為Spring Security,而是叫Acegi Security;但這并不意味著它與Spring毫無(wú)關(guān)系,它仍然是為Spring提供安全支持的。
Acegi Security搭上了Spring的便車(chē),搖身一變成為Spring Security,但即便如此其還是繼承了Acegi Security的臃腫繁瑣的配置,學(xué)習(xí)成本相對(duì)還是十分的高。
直到有一天,Spring Boot橫空出世,提出約定優(yōu)于配置等理念,極大的簡(jiǎn)化了繁瑣的配置;Spring Security也收益于此,一飛沖天。
功能介紹
安全這個(gè)話(huà)題繞不開(kāi) 認(rèn)證 和 授權(quán) 這兩個(gè)方面,Spring Security也是如此,其作為一個(gè)權(quán)限管理框架,最核心的功能有:
認(rèn)證(你是誰(shuí)?)
授權(quán)(你能做什么?)
攻擊防護(hù)(防止偽造身份)
Spring Security提供了很多的認(rèn)證和授權(quán)方案,但作為一個(gè)優(yōu)秀的開(kāi)放框架,它的優(yōu)點(diǎn)更在于“擴(kuò)展性”,當(dāng)其提供的認(rèn)證或授權(quán)方案無(wú)法滿(mǎn)足我們的需求時(shí),我們可以自定義認(rèn)證或授權(quán)邏輯。例如后續(xù)會(huì)講解到的《認(rèn)證(三):驗(yàn)證碼認(rèn)證登錄模式》。
實(shí)現(xiàn)原理
Spring Security底層是通過(guò)一組過(guò)濾器鏈來(lái)實(shí)現(xiàn)的,過(guò)濾器鏈上的每個(gè) Filter 各司其職,但同時(shí)又相互關(guān)聯(lián);因此了解 Filter 的順序就顯得十分的重要,下面會(huì)介紹幾個(gè)比較核心的Filter。

如圖所示,一個(gè)請(qǐng)求在到達(dá)API之前會(huì)經(jīng)過(guò)Spring Security的過(guò)濾器鏈進(jìn)行校驗(yàn),只有"合法規(guī)范"的請(qǐng)求才能被API所接收。
熒光綠的都屬認(rèn)證過(guò)濾器,我們可以配置其是否生效,也可以自定義認(rèn)證過(guò)濾器添加到過(guò)濾器鏈上,可控性相對(duì)比較高;其他的深藍(lán)色ExceptionTranslationFilter和橘色FilterSecurityinterecptor則沒(méi)法隨意的控制。
備注:為避免引入過(guò)多的概念,該過(guò)濾器鏈并非完整的鏈路圖,只是截圖了部分過(guò)濾器。
1. 表單登錄過(guò)濾器
UsernamePasswordAuthenticationFilter 是表單登錄過(guò)濾器,表單登錄也是我們最常見(jiàn)的登錄方式;對(duì)于表單登錄過(guò)濾器來(lái)說(shuō),它的主要職責(zé)為:
檢查請(qǐng)求是否為登錄請(qǐng)求&檢查請(qǐng)求中是否含有自身需要的認(rèn)證信息(username、password)。
如果不滿(mǎn)足則放行讓下一個(gè)過(guò)濾器進(jìn)行校驗(yàn),如符合自身認(rèn)證要求則進(jìn)行認(rèn)證。
2. Basic認(rèn)證過(guò)濾器
BasicAuthenticationFilter 過(guò)濾器是用來(lái)處理Http請(qǐng)求中的Basic Authorization頭部;當(dāng)一個(gè) Http請(qǐng)求頭(Reqeust Header)中包含Authorization,并且其值為 Basic xxx的時(shí)候,BasicAuthenticationFilter就會(huì)生效。
主要職責(zé):
嘗試解析
Http basic authorization獲取相應(yīng)的認(rèn)證信息(username、password)。如果不滿(mǎn)足則放行讓下一個(gè)過(guò)濾器進(jìn)行校驗(yàn),如符合則自身進(jìn)行認(rèn)證。
3. 異常轉(zhuǎn)換過(guò)濾器
ExceptionTranslationFilter 是一個(gè)異常過(guò)濾器,用來(lái)處理 認(rèn)證 或 授權(quán)過(guò)程中拋出的異常,這個(gè)很好理解;正如我們自身項(xiàng)目會(huì)有異常處理一般,Spring Security也有對(duì)應(yīng)的異常處理機(jī)制。
該過(guò)濾器的主要職責(zé)是對(duì)在 FilterChain 范圍內(nèi)拋出的AccessDeniedException(授權(quán)異?;?lèi)) 和 AuthenticationException(認(rèn)證異常基類(lèi)),轉(zhuǎn)換為對(duì)應(yīng)的HTTP錯(cuò)誤碼返回或者返回對(duì)應(yīng)的頁(yè)面。
4. FilterSecurityInterceptor過(guò)濾器
FilterSecurityInterceptor過(guò)濾器位于過(guò)濾器鏈上的最后一環(huán),其主要負(fù)責(zé)的是:權(quán)限的校驗(yàn);判斷請(qǐng)求的用戶(hù)是否有權(quán)限訪(fǎng)問(wèn)該API。保護(hù)web Uri 并且在訪(fǎng)問(wèn)被拒絕時(shí)拋出異常。
總結(jié)
本篇文章為 Spring Security 系列文章的概述篇,主要介紹了Spring Security的前世今生、提供的主要功能、以及其實(shí)現(xiàn)原理的粗略探討。后面我繼續(xù)跟大家深入講解。

-END-
近期熱門(mén)推薦? 1.為什么建議大家使用 Linux 開(kāi)發(fā)?爽(外加七個(gè)感嘆號(hào))
2.為什么 Java 中“1000==1000”為false,而”100==100“為true?
2.我去頭條面試,面試官問(wèn)我如何設(shè)計(jì)好API,看看我是如何吊打面試官的!
4.一個(gè)依賴(lài)搞定 Spring Boot 反爬蟲(chóng),防止接口盜刷!
5.Springboot啟動(dòng)擴(kuò)展點(diǎn)超詳細(xì)總結(jié),再也不怕面試官問(wèn)了
如有文章對(duì)你有幫助,
在看和轉(zhuǎn)發(fā)是對(duì)我最大的支持!
關(guān)注Java開(kāi)發(fā)寶典
每天學(xué)習(xí)技術(shù)干貨
點(diǎn)贊是最大的支持?


