本篇介紹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
}
}
若文章對您有幫助還幫忙點一下廣告,感恩。
範例專案結構如下。
參考:
如何跟 菜鳥工程師 肉豬先生取得聯係,最近在開發SPRING BOOT,看了肉豬先生的文,得到很多有用的資訊,想說肉豬的經驗很可貴,有機會可以問問題嗎???
回覆刪除@小熊維尼 有任何問題可以直接在這詢問喔
回覆刪除想請問一下大大一個問題
回覆刪除現在開發登出功能的api,路徑位址為"/logout"
但與預設的log out 功能的路徑一樣
所以在security的時候,經過OrRequestMatcher macth 完之後
在進入spring boot controller 會檢查 request body 的格式
會因為預設/logout的路徑在security 被洗掉controller 的 request body
不知道有什麼辦法可以讓預設的/logout 跳出檢查的程序,不讓/logout 在
OrRequestMatcher 檢查到
@萬神殿下的牧羊人
回覆刪除不好意思您的提問我不太懂,能說明你的最終目的是什麼嗎?