Spring Security 起步
1. 前言
上一節(jié)我們介紹了「Spring Security」的誕生與應(yīng)用,本節(jié)將創(chuàng)建一個最基本的 Spring Security 應(yīng)用,以便理解 Spring Security 的運(yùn)行機(jī)制。
本節(jié)實(shí)例是在 Servlet 應(yīng)用中集成 Spring Security 安全框架,在標(biāo)準(zhǔn)的 Servlet 過濾器(Filter)中應(yīng)用 Spring Security 安全機(jī)制。
基本環(huán)境說明:
- Jdk 8
- Maven
- Spring Boot
- Spring Security 5.3.2
2. 實(shí)例詳解
2.1 項(xiàng)目的目錄結(jié)構(gòu)
本實(shí)例我們一共需要創(chuàng)建兩個文件,其一是 maven 的工程描述文件 pom.xml
我們把它放在工程的根目錄下;其二是 Spring Boot 項(xiàng)目的啟動文件 HelloSecurityApplication.java
。
完整的目錄描述如下:
├── pom.xml
├── src/
└── main/
└──java/
└──imooc/
└──springsecurity/
└──HelloSecurityApplication.java
2.2 增加 Spring Security 依賴
首先,我們要將 Spring Boot 環(huán)境配置到工程中,也就是在 pom.xml
文件中將當(dāng)前工程的父級依賴指定為 Spring Boot。
此步寫法如下,在 pom.xml
文件中增加以下節(jié)點(diǎn)信息:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/>
</parent>
第二步,在配置好父級依賴后,繼續(xù)在 pom.xml 中增加 Spring Security 依賴「spring-boot-starter-security」。
此步寫法如下:
<dependencies>
<!-- 重點(diǎn)依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
第三步,為了讓本實(shí)例的效果看得見,我們要將它設(shè)置成 Web 工程,所以我們需要繼續(xù)在 pom.xml
文件中添加依賴。
此步寫法如下:
<dependencies>
...
<!-- 用于展示認(rèn)證效果 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.3 增加啟動類
在 src/main/java
中創(chuàng)建類 HelloSecurityApplication.java
,并設(shè)置包名(本項(xiàng)目包名為:imooc.springsecurity
),之后在該類中增加 Spring Boot 啟動聲明。
package imooc.springsecurity;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class HelloSecurityApplication {
public static void main(String[] args) {
SpringApplication.run(HelloSecurityApplication.class, args);
}
/**
* 此方法用于演示測試結(jié)果。
*/
@RequestMapping("/hello")
private String sayHello() {
return "{'msg': 'hi'}";
}
}
到此為止,我們的「Spring Security」項(xiàng)目就搭建完成了。
2.4 運(yùn)行測試
為了避免不同開發(fā)環(huán)境的干擾,我們統(tǒng)一使用 Maven 命令行的方式編譯和執(zhí)行項(xiàng)目。
打開控制臺,在 pom.xml 同級目錄(工程根目錄)中輸入命令 mvn spring-boot:run
來啟動 Spring Boot 。
此步執(zhí)行命令如下:
mvn spring-boot:run
訪問 http://localhost:8080/hello
可以看到如下頁面,此時系統(tǒng)要求我們輸入用戶名密碼完成身份認(rèn)證。
Spring Security 項(xiàng)目在默認(rèn)配置下,會自動生成一個名為「user」的用戶,并分配其隨機(jī)密碼,此密碼可以從控制臺的日志信息中找到:
...
Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336
...
填入用戶名密碼,點(diǎn)擊登錄,將看到認(rèn)證結(jié)果頁:
3. Spring Boot 的默認(rèn)配置項(xiàng)
在剛剛的實(shí)例中,我們并沒有做任何關(guān)于安全性的配置,但是應(yīng)用系統(tǒng)以及自帶了訪問控制,并且生成了一個測試用戶,這是怎么做到的呢?答案就在 Spring Security 的默認(rèn)配置中。
在 Spring Boot 方式下啟動 Spring Security 工程,將會自動開啟如下配置項(xiàng):
- 默認(rèn)開啟一系列基于
springSecurityFilterChain
的 Servlet 過濾器,包含了幾乎所有的安全功能,例如:保護(hù)系統(tǒng) URL、驗(yàn)證用戶名、密碼表單、重定向到登錄界面等; - 創(chuàng)建
UserDetailsService
實(shí)例,并生成隨機(jī)密碼,用于獲取登錄用戶的信息詳情; - 將安全過濾器應(yīng)用到每一個請求上。
除此之外,Spring Security 還有一些其他可配置的功能:
- 限制所有訪問必須首先通過認(rèn)證;
- 生成默認(rèn)登錄表單;
- 創(chuàng)建用戶名為「user」的可以通過表單認(rèn)證的用戶,并為其初始化密碼;
- 使用 BCrypt 方式加密密碼;
- 提供登出的能力;
- 保護(hù)系統(tǒng)不受 CSRF 攻擊;
- 會話固定保護(hù);
- 集成安全消息頭;
- 提供一些默認(rèn)的 Servlet 接口,如:「getRemoteUser」、「getUserPrincipal」、「isUserInRole」、「login」和「logout」。
以上內(nèi)容我們將在后續(xù)的章節(jié)中陸續(xù)向大家介紹。
4. 小結(jié)
下一節(jié),我們將討論 Spring Security 的安全架構(gòu),了解其設(shè)計(jì)思路。