網頁

2019/10/18

Spring Boot + Spring Security 基本配置設定教學

本篇介紹Spring Boot + Spring Security的基本配置。


範例環境:

  • Windows 64 Bit
  • Java 11
  • Eclipse Version: 2019-03 (4.11.0)
  • Spring Boot版本2.1.9.RELEASE
  • Maven

本範例使用Eclipse STS plug-in建立Spring Boot專案,所以先在Eclipse的MarketPlace搜尋STS然後安裝。

點選Eclipse工具列的File -> New -> Other -> Spring Boot -> Spring Starter Project



接著設定Project的Maven資訊,如果不清楚怎麼設定按照下面範立設定即可。



瀏覽左側的Spring Boot的框架選單,勾選Spring Web及Spring Security加入為dependency,然後按Finish,STS便會幫我們生成一個Spring Boot專案。



完成後專案結構如下。



專案的pom.xml如下。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.abc</groupId>
    <artifactId>spring-boot-security</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-security</name>
    <description>Spring Boot Security</description>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


到此便完成了基本的Spring Boot + Spring Security設定。


打開Spring Boot的預設配置檔,即src/main/resoucres下的application.properties來設定專案的context path及port。

application.properties

#context path
server.servlet.context-path=/demo
#port
server.port=8080

啟動專案應用程式,在瀏覽器開啟http://localhost:8080/demo便會進入Spring Security預設的登入頁面位置http://localhost:8080/demo/login



Spring Security預設是保護環境路徑(context path)下的所有資源,所以在未通過Spring Security的驗證之前,存取任何http://localhost:8080/demo下的資源都會被Spring Security導向預設的登入位置/login,也就是上面的登入頁面。

Spring Security預設提供一組登入帳號 user 及自動生成的密碼,以此帳號密碼來進行登入。

登入後畫面如下,因為此時http://localhost:8080/demo路徑並沒有提供任何資源,也就是目前並未建立Controller對外提供API,所以Spring Boot預設會返回下面的Whitelabel Error Page 。




停止應用程式,建立一個Controller DemoController並設定一個資源位址"/"如下。

DemoController

package com.abc.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {
    
    @GetMapping(value = "/")
    public String demo() {
        return "Spring Boot + Spring Security Configuration Demo";
    }

}

重新啟動專案,同樣在瀏覽器輸入http://localhost:8080/demo,輸入帳號密碼登入後便會返回DemoController.demo()設定的內容。




但工作中通常不會使用Spring Security提供的預設設定,而是需要各種自訂配置,例如自訂驗證規則、驗證失敗、授權失敗、登入位置、登入頁面、保護的資源路徑、驗證時的使用者來源等;而自訂Spring Security的配置可透過建立一個配置類如下。

下面的DemoWebSecurityConfig即為Spring Security的配置,類別前掛上@EnableWebSecurity並繼承WebSecurityConfigurerAdapter

DemoWebSecurityConfig

package com.abc.demo.config.security;

import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@EnableWebSecurity
public class DemoWebSecurityConfig extends WebSecurityConfigurerAdapter {
    
}

如此便可在DemoWebSecurityConfig中透過覆寫WebSecurityConfigurerAdapter的下面方法來自訂各種配置。
protected void configure(HttpSecurity http) throws Exception
protected void configure(AuthenticationManagerBuilder auth) throws Exception
public void configure(WebSecurity web) throws Exception

例如下面覆寫了WebSecurityConfigurerAdapter.configure(HttpSecurity http)並透過傳入的HttpSecurity物件來自訂各種配置,例如啟用表單登入或是HTTP Basic驗證,要被驗證的請求,設定保護的資源,預設的登入路徑等等。

下面的設定除了CSRF設定外其餘與Spring Security預設的配置相同。

DemoWebSecurityConfig

package com.abc.demo.config.security;

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@EnableWebSecurity
public class DemoWebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
        .anyRequest()
        .authenticated()
        .and().formLogin()
        .and().httpBasic()
        .and().csrf().disable(); // <-- 關閉CSRF,請求時才不用另外帶CSRF token
    }

}

若文章對您有幫助還幫忙點一下廣告,感恩。

範例專案結構如下。




參考:

4 則留言:

  1. 如何跟 菜鳥工程師 肉豬先生取得聯係,最近在開發SPRING BOOT,看了肉豬先生的文,得到很多有用的資訊,想說肉豬的經驗很可貴,有機會可以問問題嗎???

    回覆刪除
  2. @小熊維尼 有任何問題可以直接在這詢問喔

    回覆刪除
  3. 想請問一下大大一個問題

    現在開發登出功能的api,路徑位址為"/logout"
    但與預設的log out 功能的路徑一樣

    所以在security的時候,經過OrRequestMatcher macth 完之後
    在進入spring boot controller 會檢查 request body 的格式
    會因為預設/logout的路徑在security 被洗掉controller 的 request body

    不知道有什麼辦法可以讓預設的/logout 跳出檢查的程序,不讓/logout 在
    OrRequestMatcher 檢查到

    回覆刪除
  4. @萬神殿下的牧羊人
    不好意思您的提問我不太懂,能說明你的最終目的是什麼嗎?

    回覆刪除