
- Spring Security 教程
- Sprint Security - 首頁
- Spring Security - 簡介
- Spring Security - 架構
- Spring Security - 專案模組
- Spring Security - 環境設定
- Spring Security - 表單登入
- Spring Security - 自定義表單登入
- Spring Security - 登出
- Spring Security - 記住我
- Spring Security - 重定向
- Spring Security - 標籤庫
- Spring Security - XML 配置
- Spring Security - 認證提供程式
- Spring Security - 基本認證
- Spring Security - AuthenticationFailureHandler
- Spring Security - JWT
- Spring Security - 獲取使用者資訊
- Spring Security - Maven
- Spring Security - 預設密碼編碼器
- Spring Security – 密碼編碼
- Spring Security - 方法級別
- Spring Security 有用資源
- Spring Security - 快速指南
- Spring Security - 有用資源
- Spring Security - 討論
Spring Security - 記住我
“記住我”是 Spring Security 的一項重要功能,即使會話過期,使用者也可以保持登入應用程式狀態。我們將在以下部分演示 Spring Security 提供的“記住我”功能的使用。
“記住我”功能執行以下重要功能。
首先,它將在我們使用 formLogin() 生成的預設登入表單中新增一個“記住我”複選框。
對於自定義登入表單,我們需要向表單新增一個名為“remember-me”的複選框。如果需要使用不同的名稱,則需要在 Spring Security 配置期間配置新名稱,如下所示
.rememberMe().rememberMeParameter("remember")
其次,選中複選框會生成“記住我”Cookie。Cookie 儲存使用者身份,瀏覽器會儲存它。
Spring Security 在將來的會話中檢測到 Cookie 以自動執行登入。因此,使用者無需再次登入即可再次訪問應用程式。
可以顯式配置“記住我”,如下所示 -
protected void configure(HttpSecurity http) throws Exception { http // ... // key should be unique .rememberMe(config -> config.key("123456") .tokenValiditySeconds(3600)) .build(); }
重要方法
以下是在 logout() 方法中可以配置的重要方法。
rememberMe () − 這將用於實現“記住我”功能。傳遞給“記住我”函式的金鑰必須是唯一的且安全的。此金鑰特定於應用程式,用於生成“記住我”令牌內容。
tokenValiditySeconds () − 這將用於設定“記住我”Cookie 的過期時間。預設情況下,有效期為 2 周。我們可以隨時自定義它,如上面的程式碼片段所示,我們使用 3600 秒將其設定為 1 小時。
rememberMeParameter () − 這用於將輸入複選框標記為“記住我”複選框。預設情況下,其值為 remember-me。
讓我們開始使用 Spring Security 進行實際程式設計。在開始使用 Spring 框架編寫示例之前,您必須確保已正確設定 Spring 環境,如Spring Security - 環境設定章節中所述。我們還假設您對 Spring Tool Suite IDE 有些瞭解。
現在讓我們繼續編寫一個基於 Spring MVC 的應用程式,該應用程式由 Maven 管理,它將提示使用者登入、對使用者進行身份驗證,然後提供使用 Spring Security 表單登入功能登出的選項。
使用 Spring Initializr 建立專案
Spring Initializr 是開始 Spring Boot 專案的好方法。它提供了一個易於使用的使用者介面來建立專案、新增依賴項、選擇 Java 執行時等。它生成一個骨架專案結構,下載後可以匯入到 Spring Tool Suite 中,然後我們可以繼續使用我們的現成專案結構。
我們選擇一個 Maven 專案,將專案命名為 formlogin,Java 版本為 21。添加了以下依賴項
Spring Web
Spring Security
Spring Boot DevTools

Thymeleaf 是 Java 的模板引擎。它允許我們快速開發靜態或動態網頁,以便在瀏覽器中呈現。它具有極強的可擴充套件性,允許我們詳細定義和自定義模板的處理。此外,我們可以透過點選此連結瞭解更多關於 Thymeleaf 的資訊。
讓我們繼續生成我們的專案並下載它。然後,我們將它解壓縮到我們選擇的資料夾中,並使用任何 IDE 開啟它。我將使用Spring Tools Suite 4。它可以從https://springframework.tw/tools網站免費下載,並且針對 Spring 應用程式進行了最佳化。
包含所有相關依賴項的 pom.xml
讓我們看看我們的 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>3.3.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.tutorialspoint.security</groupId> <artifactId>formlogin</artifactId> <version>0.0.1-SNAPSHOT</version> <name>formlogin</name> <description>Demo project for Spring Boot</description> <url/> <licenses> <license/> </licenses> <developers> <developer/> </developers> <scm> <connection/> <developerConnection/> <tag/> <url/> </scm> <properties> <java.version>21</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-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity6</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </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 Security 配置類
在我們的 config 包中,我們建立了 WebSecurityConfig 類。我們將使用此類進行安全配置,因此讓我們使用 @Configuration 註解和 @EnableWebSecurity 對其進行註釋。因此,Spring Security 知道將此類視為配置類。正如我們所看到的,Spring 使配置應用程式變得非常容易。
WebSecurityConfig
package com.tutorialspoint.security.formlogin.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; 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.configurers.AbstractHttpConfigurer; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class WebSecurityConfig { @Bean protected UserDetailsService userDetailsService() { UserDetails user = User.builder() .username("user") .password(passwordEncoder().encode("user123")) .roles("USER") .build(); UserDetails admin = User.builder() .username("admin") .password(passwordEncoder().encode("admin123")) .roles("USER", "ADMIN") .build(); return new InMemoryUserDetailsManager(user, admin); } @Bean protected PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http .csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests( request -> request.requestMatchers("/login").permitAll() .requestMatchers("/**").authenticated() ) .formLogin(form -> form.loginPage("/login") .defaultSuccessUrl("/") .failureUrl("/login?error=true") .permitAll()) .rememberMe(config -> config.key("123456") .tokenValiditySeconds(3600)) .logout(config -> config .logoutUrl("/logout") .logoutSuccessUrl("/login") .invalidateHttpSession(true) .deleteCookies("JSESSIONID")) .build(); } }
在這裡,我們提到了帶有安全金鑰的 rememberMe() 以供 Spring Security 使用。
控制器類
在此類中,我們為“/”端點和“/login”建立了對映,分別用於此應用程式的索引頁面和登入頁面。
AuthController.java
package com.tutorialspoint.security.formlogin.controllers; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class AuthController { @GetMapping("/") public String home() { return "index"; } @GetMapping("/login") public String login() { return "login"; } }
檢視
讓我們在 /src/main/resources/templates 資料夾中建立 index.html,其內容如下,作為主頁並顯示已登入使用者的名稱。
index.html
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org" xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3"> <head> <title> Hello World! </title> </head> <body> <h1 th:inline="text">Hello <span sec:authentication="name"></span>!</h1> <form th:action="@{/logout}" method="post"> <input type="submit" value="Sign Out"/> </form> </body> <html>
login.html
讓我們在 /src/main/resources/templates 資料夾中建立 login.html,其內容如下,作為登入頁面。我們使用預設名稱 username、password 和 remember-me 作為文字欄位。如果使用其他名稱,則也需要在 Spring Security 配置類中設定相同的名稱。
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org" xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3"> <head> <title>Spring Security Example</title> </head> <body> <div th:if="${param.error}"> <p>Bad Credentials</p> </div> <div th:if="${param.logout}">You have been logged out.</div> <form th:action="@{/login}" method="post"> <h1>Please sign in</h1> <table> <tr> <td><label for="username"><b>Username</b></label></td> <td><input type="text" placeholder="Enter Username" name="username" id="username" required></td> </tr> <tr> <td><label for="password"><b>Password</b></label></td> <td><input type="password" placeholder="Enter Password" name="password" id="password" required></td> </tr> <tr> <td><label for="remember-me"><b>Remember Me</b></label> </td> <td><input type="checkbox" name="remember-me" /></td> </tr> <tr> <td> </td> <td><input type="submit" value="Sign In" /></td> </tr> </table> </form> </body> </html>
在登入表單中,我們使用 POST 方法登入,同時使用名稱和 ID 為 username、password 和 remember-me 複選框的輸入欄位。如果選中複選框,則使用者登入應用程式時將建立一個“記住我”Cookie。
執行應用程式
由於我們所有元件都已準備就緒,讓我們執行應用程式。右鍵單擊專案,選擇 Run As,然後選擇 Spring Boot App。
它將啟動應用程式,並且應用程式啟動後,我們可以執行 localhost:8080 以檢查更改。
輸出
現在開啟 localhost:8080,您可以在其中看到我們的登入頁面,其中包含“記住我”複選框。
帶有“記住我”複選框的登入頁面

未選中“記住我”的主頁
輸入有效憑據,不要選中“記住我”複選框。

它將載入主頁。我們可以驗證“記住我”Cookie 是否不可用。

選中“記住我”登入
現在點選登出按鈕,這將再次載入登入頁面。選中“記住我”複選框並登入。

選中“記住我”的主頁
現在我們可以檢查“記住我”Cookie 是否可用。

“記住我”Cookie
“記住我”Cookie 包含以下詳細資訊
username - 用於識別已登入的使用者。可用於檢索使用者名稱
expirationTime - Cookie 的過期時間。預設為 2 周。
Hash - 使用者名稱、expirationTime、密碼和用於建立 Cookie 的私鑰的 MD5 編碼雜湊。
如果使用者名稱或密碼更改,則 Cookie 將失效,必須重新建立。
如果未設定“記住我”Cookie,則會話超時後重新整理頁面將載入登入頁面。而如果“記住我”Cookie 已設定並處於活動狀態,則重新整理頁面將僅重新整理頁面並使用“記住我”Cookie 中的令牌建立新的會話。