博客 / 詳情

返回

創建SpringSecurity項目

前言

在上一章節中,已經帶大家認識了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案例,你會發現,其實代碼很簡單,添加必要的依賴包,對登錄賬户做必要的配置就可以了。不知道第一個案例,你是學會了還是學廢了?可以留言評論,告訴,我會在後面對內容進行必要的優化!

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.