前言
在上一章節中,已經帶大家認識了Spring Security,對其基本概念已有所瞭解,但是作為一個合格的程序員,最關鍵的肯定還是得動起手來,所以從本篇文章開始,我就帶大家搭建第一個Spring Security項目,看看如何利用Spring Security來保護我們的Java Web項目。
一. 搭建SpringBoot開發環境
我們的Spring Security系列教程會基於SpringBoot環境,並且以案例迭代的方式進行開發,所以為了方便後續案例的編寫,我們先提前搭建一個SpringBoot環境的Web項目。
1.創建SpringBoot項目如各位對SpringBoot基礎不熟悉,請參考本人的SpringBoot系列教程:blog.csdn.net/syc000666/a…SpringBoot項目的具體創建過程如下圖所示。
1.1 創建一個基於Maven的Project項目。
1.2 設置項目名稱和存儲位置
2.添加項目依賴在pom.xml文件中,添加配置SpringBoot開發環境的依賴包。
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.2.5.RELEASE</spring-boot.version>
<spring-platform.version>Cairo-SR3</spring-platform.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--BOM(bill of materials):材料清單,用於解決jar包依賴的好方法-->
<!--緣起:Spring現在已發展成一個龐大體系。比如security、mvc等。如此一來,不同模塊或者與外部進行集成時,
依賴處理就需要各自對應版本號。比如,較新spring與較老的quartz,它們集成就會遇到問題,給搭建和升級帶來不便。
因此Spring IO Platform應運而生,只要項目中引入了它,外部集成時依賴關係無需版本號。-->
<dependency>
<groupId>io.spring.platform</groupId>
<artifactId>platform-bom</artifactId>
<version>${spring-platform.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!--配置中央倉庫-->
<repositories>
<repository>
<id>aliyun-repos</id>
<url>https://maven.aliyun.com/repository/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
複製代碼添加完SpringBoot中主要的依賴包之後,我們就可以在這個環境中進行Web項目開發了。
二. 創建第一個SpringSecurity項目我們在上面的SpringBoot開發環境中,創建出第一個SpringSecurity模塊,具體創建過程略(嘿嘿)。
1.添加模塊中的pom依賴我們在該module中,添加項目開發時必要的依賴包,主要是添加SpringSecurity的依賴包,在這裏會完美體現SpringBoot中”約定大於配置“的思想哦。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--核心安全依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.創建web接口接下來我們隨便編寫一個web接口,方便後面進行測試。package com.yyg.security.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, 來跟 一一哥 學習 Spring Security吧!";
}
}
3.創建項目入口類package com.yyg.security;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Demo01Application {
public static void main(String[] args) {
SpringApplication.run(Demo01Application.class, args);
}
}
4.項目目錄結構此時我們的項目包結構如下圖所示:
5.啓動項目我們把項目啓動起來後,在瀏覽器中對Web接口進行訪問,會發現接口是無法直接訪問的。在訪問接口之前會自動跳轉到"/login"地址,進入到一個登錄界面。這是因為Spring Boot中"約定大約配置"的規則,只要我們添加了Spring Security的依賴包,就會自動開啓安全限制,在訪問Web接口之前會進行安全攔截。只有輸入了用户名和密碼,才能訪問項目中的Web接口。
此時登錄界面中,要求我們輸入用户名和密碼。這個默認的用户名是“user”,密碼是一個用UUID生成的隨機字符串。在每次啓動項目時,都可以在控制枱中看到生成的隨機密碼,如下圖所示:
6.隨機密碼生成機制可能有小夥伴會很好奇,這個隨機的密碼到底是在哪裏生成的呢?一一哥 帶各位分析一下Spring Security的源碼,來看看這個密碼的生成策略。這個默認的用户名和密碼其實是在SecurityProperties類中定義的,源碼如下圖:
而控制枱上打印的密碼日誌,是在UserDetailsServiceAutoConfiguration類的getOrDeducePassword()方法中輸出的。
我們只要把這個隨機密碼,複製粘貼到登錄頁面的密碼框中,就可以訪問"/hello"接口了。
7.配置Security賬户從上面的源碼分析可知,默認的登錄密碼是利用UUID生成的隨機字符串,很明顯如果我們使用這個字符串作為登錄密碼,就太麻煩了。那麼有沒有更方便的登錄賬户呢?作為一個框架,我可以很負責的告訴各位,這肯定是有的!所以Security框架允許我們自己配置用户名和密碼,並且提供了2種方式來進行自定義用户名和密碼:①. 在配置文件中定義;②. 在配置類中定義。
7.1 配置用户信息在本案例中帶各位採用配置文件的方式來進行實現,首先我們創建一個application.yml配置文件,配置如下:spring:
security:
user:
name: yyg
password: 123
7.2 setPassword()源碼分析在這裏配置了自定義的用户名和密碼後,在Spring Security的源碼中,會通過調用SecurityProperties的 set()方法 注入到對應的屬性中。我們來看下 SecurityProperties.User#setPassword() 方法的源碼:
由此我們可以看到,passwordGenerated屬性變成了false,結合上文的源碼分析,我們就知道在控制枱不會再輸出打印密碼信息了。
8.重啓項目接着我們重啓項目,這時候利用我們自己配置的用户名和密碼,就可以訪問"/hello"接口了。
這樣我們只需要添加一個security的依賴包,就可以實現Web安全控制了。這樣,一一哥 就帶大家實現了第一個Spring Security案例,你會發現,其實代碼很簡單,添加必要的依賴包,對登錄賬户做必要的配置就可以了。不知道第一個案例,你是學會了還是學廢了?可以留言評論,告訴,我會在後面對內容進行必要的優化!