第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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)證。

圖片描述

身份認(rèn)證

Spring Security 項(xiàng)目在默認(rèn)配置下,會自動生成一個名為「user」的用戶,并分配其隨機(jī)密碼,此密碼可以從控制臺的日志信息中找到:

...
Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336
...

填入用戶名密碼,點(diǎn)擊登錄,將看到認(rèn)證結(jié)果頁:

圖片描述

認(rèn)證結(jié)果
此時,我們完成了第一個「Spring Security」實(shí)例。

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é)
本節(jié)作為 Spring Security 的起點(diǎn),展示了如何在 Spring Boot 項(xiàng)目中集成 Spring Security 功能。Spring Security 默認(rèn)情況下會打開用戶的表單認(rèn)證功能,并創(chuàng)建用戶名為「user」的測試用戶,其密碼在系統(tǒng)啟動時生成,可在系統(tǒng)啟動日志中找到。

下一節(jié),我們將討論 Spring Security 的安全架構(gòu),了解其設(shè)計(jì)思路。