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