Spring Security 簡(jiǎn)介
1. 前言
不難證明,外賣(mài)和我們的生活越來(lái)越緊密,我們也許天天都點(diǎn)外賣(mài),那有沒(méi)有想過(guò),為什么我們敢把自己的姓名、身份證、手機(jī)、銀行卡、家庭住址等等一系列敏感信息都放心地告訴給第三方平臺(tái)?這離不開(kāi)一個(gè)詞「信任」。當(dāng)我點(diǎn)了一單外賣(mài),為什么飯店看得到我的訂單?為什么配送員可以找得到我家?為什么客服中心可以處理投訴?為什么財(cái)務(wù)人員可以劃撥?這里又出現(xiàn)了另一個(gè)詞「職責(zé)」。
所謂「信任」,就是我知道你是誰(shuí),我也相信你做的事;所謂「職責(zé)」,就是我們相互獨(dú)立又共同協(xié)作。在 IT 系統(tǒng)中,「信任」是通過(guò)「認(rèn)證」來(lái)完成的,「職責(zé)」是通過(guò)「權(quán)限」來(lái)實(shí)現(xiàn)的,它們又被統(tǒng)稱(chēng)為「應(yīng)用安全」??梢?jiàn),「安全」是 IT 系統(tǒng)正常運(yùn)營(yíng)的必要條件之一。既然「安全」如此重要,那有沒(méi)有一套框架可以幫助 Spring Boot 開(kāi)發(fā)者快速地、規(guī)范地、有效地構(gòu)建自己 IT 系統(tǒng)的安全環(huán)境呢?當(dāng)然有,那就是本次課程的主題:「Spring Security」安全框架。
2. Spring Security 簡(jiǎn)介
2.1 Spring Security 的誕生
Spring Security 是 Spring 家族的中,提供認(rèn)證、授權(quán)和攻擊防護(hù)功能的一套安全框架。Spring Security 支持命令式和響應(yīng)式兩種開(kāi)發(fā)模式,它也是 Spring 應(yīng)用在安全框架方面的公認(rèn)標(biāo)準(zhǔn)。
Spring Security 的前身是 Acegi security。Acegi security 在 1.0.7 版本之后便不再跟新,轉(zhuǎn)而以 Spring Security 2.0 的身份出現(xiàn)在 Spring 大家庭中。截止今日(2020 年 5 月 17 日),Spring Security 正式版本已經(jīng)發(fā)展至 5.3,并且已經(jīng)公布 5.4 的預(yù)覽版本。
2.2 Spring Security 和同類(lèi)型框架的比較
Java 環(huán)境下有兩大安全框架:Spring Security 和 Shiro。
和 Spring Security 一樣,Shiro 同樣隸屬于一個(gè)強(qiáng)大的軟件社區(qū): Apache。二者的功能類(lèi)似,都完成了認(rèn)證和鑒權(quán)功能,都有超過(guò)十年的發(fā)展歷史。Shiro 是一個(gè)獨(dú)立的安全框架,Spring Security 則與 Spring 關(guān)聯(lián)緊密,所以在二者的選擇上,可以簡(jiǎn)單的用如下原則區(qū)分:
如果我們開(kāi)發(fā) Spring Boot 項(xiàng)目,那優(yōu)先建議使用 Spring Security 安全框架。如果我們開(kāi)發(fā)其他類(lèi)型的項(xiàng)目,那請(qǐng)使用 Shiro 作為安全框架。
Spring Security 安全框架適合為 Spring Boot 項(xiàng)目提供安全保護(hù),所以如果您是個(gè) Spring Boot 項(xiàng)目的開(kāi)發(fā)人員,且正在尋找一種可以和 Spring Boot 輕松集成的,用于認(rèn)證和鑒權(quán)的框架時(shí),可以?xún)?yōu)先考慮 Spring Security。
2.3 Spring Security 相關(guān)資源:
官方網(wǎng)站:https://spring.io/projects/spring-security
問(wèn)題跟進(jìn):https://github.com/spring-projects/spring-security/issues
3. Spring Security 的特性
Spring Security 的核心特性包括:認(rèn)證和授權(quán)、常規(guī)攻擊防范、與 Servlet 接口集成、與 Spring MVC 集成等。
認(rèn)證和授權(quán)的目的是,讓系統(tǒng)知道使用者是誰(shuí)(認(rèn)證)?是什么樣的身份?允許他做什么?禁止他做什么?通常的做法是要求用戶(hù)輸入自己的用戶(hù)名和密碼,來(lái)實(shí)現(xiàn)登錄和鑒權(quán)的過(guò)程。
常規(guī)攻擊防范在 Spring Security 安全框架中是默認(rèn)開(kāi)啟的,常見(jiàn)的威脅抵御方式有:
- 防止偽造跨站請(qǐng)求(CSRF)
- 安全響應(yīng)頭(HTTP Response headers)
- HTTP 通訊安全
作為 Spring 大家族的一員,Spring Security 在與 Spring 引用,尤其是與 Spring boot 應(yīng)用的結(jié)合時(shí),顯得極為便利。
3. 功能模塊
Spring Security 安全框架,內(nèi)置一系列的安全子模塊,用來(lái)滿(mǎn)足不同類(lèi)型的應(yīng)用場(chǎng)景。自 3.0 版本開(kāi)始,這些子模塊被分散到了不同的 Jar 包中,開(kāi)發(fā)者可以更加清晰地、直接地選擇自己需要的模塊,簡(jiǎn)單有效地完善自己的業(yè)務(wù)功能。
Spring Security 包含的功能模塊如下:
-
Core
核心模塊,包含認(rèn)證、訪問(wèn)控制、集成支持、配置接口等,所有 Spring Security 項(xiàng)目都需要依賴(lài)它。
對(duì)應(yīng)的 Jar 文件:spring-security-core.jar。
-
Remoting
Spring security 中的 Remoting 模塊提供了與 Spring Remoting 集成的能力。當(dāng)我們要開(kāi)發(fā)遠(yuǎn)程客戶(hù)端的時(shí)候需要用到此模塊。
對(duì)應(yīng)的 Jar 文件:spring-security-remoting.jar。
-
Web
Spring security 中的 Web 模塊,提供了接口過(guò)濾器和 Web 安全的基礎(chǔ)代碼。例如 Servlet 應(yīng)用接口。如果我們開(kāi)發(fā)的是基于 Web 認(rèn)證的服務(wù),或者是基于 URL 的訪問(wèn)控制時(shí),將需要用到此模塊。
對(duì)應(yīng)的 Jar 文件:spring-security-web.jar
-
Config
Spring security 中的 Config 模塊,包含了安全框架命名空間的解析功能與提供了 Java 配置代碼。當(dāng)我們需要使用 XML 方式或者 Java 配置方式時(shí),需要用到此模塊。
對(duì)應(yīng)的 Jar 文件:spring-security-config.jar
-
LDAP
Spring security 中的 Ldap 模塊,提供了對(duì) Ldap 認(rèn)證的支持,當(dāng)我們使用 Ldap 認(rèn)證時(shí),需要用到此模塊。
對(duì)應(yīng)的 Jar 文件:spring-security-ldap.jar
-
OAuth 2.0 相關(guān)模塊
Spring security 提供了對(duì) OAuth 2.0 的支持,具體分為以下幾個(gè)模塊。
-
OAuth 2.0 Core
OAuth 2.0 Core 模塊是 Spring security 安全框架中,對(duì) OAuth 2.0 支持的核心模塊,包含了認(rèn)證功能與 OpenID 的基本支持。
對(duì)應(yīng)的 Jar 文件:spring-security-oauth2-core.jar
-
OAuth 2.0 Client
OAuth 2.0 Client 模塊是 OAuth 2.0 客戶(hù)端認(rèn)證授權(quán)基礎(chǔ),當(dāng)我們需要在客戶(hù)端實(shí)現(xiàn) OAuth 2.0 登錄功能時(shí),需要添加此模塊。
對(duì)應(yīng)的 Jar 文件:spring-security-oauth2-client.jar
-
OAuth 2.0 JOSE
OAuth 2.0 JOSE (Javascript Object Signing and Encryption)模塊,提供了基于 JS 對(duì)象的認(rèn)證與加解密功能,核心目標(biāo)是實(shí)現(xiàn) JS 安全傳輸能力。主要功能有:JWT、 JWS、JWE、JWK。
對(duì)應(yīng)的 Jar 文件:spring-security-oauth2-jose.jar
-
OAuth 2.0 Resource Server
OAuth 2.0 resource server 模塊,提供了 OAuth 2.0 資源服務(wù)的基本功能,也就是對(duì)資源的訪問(wèn)控制。
對(duì)應(yīng)的 Jar 文件:spring-security-oauth2-resource-server.jar
-
-
ACL
ACL 模塊提供了基于域?qū)ο蟮脑L問(wèn)控制。
對(duì)應(yīng)的 Jar 文件:spring-security-acl.jar
-
CAS
CAS 模塊適用于需要使用 CAS 單點(diǎn)登錄的系統(tǒng),可以用于單點(diǎn)登錄客戶(hù)端的集成。
對(duì)應(yīng)的 Jar 文件:spring-security-cas.jar
-
OpenID
OpenID 模塊適用于需要集成外部 OpenID 的認(rèn)證系統(tǒng)。使用該模塊功能同時(shí)還需要依賴(lài) OpenID4Java 。
對(duì)應(yīng)的 Jar 文件:spring-security-openid.jar
-
Test
Test 模塊提供了對(duì) Spring security 進(jìn)行單元測(cè)試的能力。
對(duì)應(yīng)的 Jar 文件:spring-security-test.jar
4. 開(kāi)始前準(zhǔn)備
Spring Security 要求使用 JDK 8 以上的 Java 編譯版本。
在 Spring Boot 項(xiàng)目中添加 Spring Security 支持非常方便,只需要使用 Spring Boot 提供的 spring-boot-starter-security
啟動(dòng)器即可。
在非 Spring Boot 項(xiàng)目中使用 Spring Security 則需要添加 Spring Security 核心組件,如:spring-security-config
和 spring-security-web
等。
5. 小結(jié)
Spring Security 是 Spring 家族中規(guī)范化的安全框架。它幫助我們輕松地構(gòu)建應(yīng)用安全環(huán)境,可以快速地實(shí)現(xiàn)「認(rèn)證」和「權(quán)限」管理,它幫助我們規(guī)范化開(kāi)發(fā)過(guò)程,是一套完整、成熟、易用的開(kāi)發(fā)框架。
下一節(jié),我們將嘗試創(chuàng)建第一個(gè) Spring Security 應(yīng)用。