使用受 Spring 安全性保護的資源創建簡單 Web 應用程序

2022-12-22 10:17:19 來源:51CTO博客

本指南將引導您完成使用受 Spring 安全性保護的資源創建簡單 Web 應用程序的過程。


(相關資料圖)

您將構建什么

您將構建一個Spring MVC應用程序,該應用程序使用由固定用戶列表支持的登錄表單來保護頁面。

你需要什么

約15分鐘最喜歡的文本編輯器或 IDEJDK 17或以后格拉德爾 4+?或梅文 3.2+您也可以將代碼直接導入到 IDE 中:彈簧工具套件 (STS)智能理念VSCode

如何完成本指南

像大多數春天一樣入門指南,您可以從頭開始并完成每個步驟,也可以繞過您已經熟悉的基本設置步驟。無論哪種方式,您最終都會得到工作代碼。

要從頭開始,請繼續從 Spring 初始化開始.

要跳過基礎知識,請執行以下操作:

下載?并解壓縮本指南的源存儲庫,或使用吉特:git clonehttps://github.com/spring-guides/gs-securing-web.git光盤成gs-securing-web/initial跳轉到創建不安全的 Web 應用程序.

完成后,您可以根據 中的代碼檢查結果。??gs-securing-web/complete??

從 Spring 初始化開始

你可以使用這個預初始化項目,然后單擊生成以下載 ZIP 文件。此項目配置為適合本教程中的示例。

手動初始化項目:

導航到https://start.spring.io.此服務拉入應用程序所需的所有依賴項,并為您完成大部分設置。選擇 Gradle 或 Maven 以及您要使用的語言。本指南假定您選擇了 Java。單擊“依賴項”,然后選擇“Spring Web”和“Thymeleaf”。單擊生成。下載生成的 ZIP 文件,該文件是配置了您選擇的 Web 應用程序的存檔。

如果您的 IDE 集成了 Spring Initializr,則可以從 IDE 完成此過程。

您也可以從 Github 分叉項目,然后在 IDE 或其他編輯器中打開它。

創建不安全的 Web 應用程序

在將安全性應用于 Web 應用程序之前,您需要一個要保護的 Web 應用程序。本節將引導您創建一個簡單的 Web 應用程序。然后,您將在下一節中使用Spring Security來保護它。

Web 應用程序包括兩個簡單視圖:主頁和“你好,世界”頁面。主頁在以下百里香葉模板中定義(來自):??src/main/resources/templates/home.html??

            Spring Security Example                

Welcome!

Click here to see a greeting.

此簡單視圖包含指向頁面的鏈接,該鏈接在以下 Thymeleaf 模板(來自):??/hello????src/main/resources/templates/hello.html??

            Hello World!                

Hello world!

Web應用程序基于Spring MVC。因此,您需要配置 Spring MVC 并設置視圖控制器以公開這些模板。下面的清單(來自)顯示了在應用程序中配置 Spring MVC 的類:??src/main/java/com/example/securingweb/MvcConfig.java??

package com.example.securingweb;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configurationpublic class MvcConfig implements WebMvcConfigurer {  public void addViewControllers(ViewControllerRegistry registry) {    registry.addViewController("/home").setViewName("home");    registry.addViewController("/").setViewName("home");    registry.addViewController("/hello").setViewName("hello");    registry.addViewController("/login").setViewName("login");  }}

該方法(重寫 中同名的方法)添加了四個視圖控制器。其中兩個視圖控制器引用名稱為 (在 中定義) 的視圖,另一個引用名為 (在 中定義) 的視圖。第四個視圖控制器引用另一個名為 的視圖。您將在下一節中創建該視圖。??addViewControllers()????WebMvcConfigurer????home????home.html????hello????hello.html????login??

此時,您可以跳到”運行應用程序“并運行應用程序,而無需登錄任何內容。

現在您有一個不安全的 Web 應用程序,您可以為其添加安全性。

設置 Spring 安全性

假設您要阻止未經授權的用戶查看 上的問候語頁面。就像現在一樣,如果訪問者單擊主頁上的鏈接,他們會看到沒有障礙的問候語來阻止他們。您需要添加一個障礙,強制訪問者登錄,然后才能看到該頁面。??/hello??

您可以通過在應用程序中配置 Spring 安全性來做到這一點。如果 Spring 安全性在類路徑上,Spring 引導??自動保護所有 HTTP 端點??使用“基本”身份驗證。但是,您可以進一步自定義安全設置。您需要做的第一件事是將 Spring 安全性添加到類路徑中。

使用 Gradle,您需要在 的閉包中添加三行(一行用于應用程序,一行用于 Thymeleaf & Spring Security 集成,一行用于測試),如以下列表所示:??dependencies????build.gradle??

implementation "org.springframework.boot:spring-boot-starter-security"http://  Temporary explicit version to fix Thymeleaf bugimplementation "org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.1.1.RELEASE"implementation "org.springframework.security:spring-security-test"

以下清單顯示了完成的文件:??build.gradle??

plugins {  id "java"  id "org.springframework.boot" version "3.0.0"  id "io.spring.dependency-management" version "1.1.0"}group = "com.example"version = "0.0.1-SNAPSHOT"sourceCompatibility = "17"repositories {  mavenCentral()}dependencies {  implementation "org.springframework.boot:spring-boot-starter-web"  implementation "org.springframework.boot:spring-boot-starter-thymeleaf"  implementation "org.springframework.boot:spring-boot-starter-security"  //  Temporary explicit version to fix Thymeleaf bug  implementation "org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.1.1.RELEASE"  implementation "org.springframework.security:spring-security-test"  testImplementation "org.springframework.boot:spring-boot-starter-test"}test {  useJUnitPlatform()}

使用 Maven,您需要向 中的元素添加兩個額外的條目(一個用于應用程序,一個用于測試),如以下清單所示:??????pom.xml??

  org.springframework.boot  spring-boot-starter-security  org.thymeleaf.extras  thymeleaf-extras-springsecurity6    3.1.1.RELEASE  org.springframework.security  spring-security-test  test

以下清單顯示了完成的文件:??pom.xml??

  4.0.0      org.springframework.boot    spring-boot-starter-parent    3.0.0         com.example  securing-web-complete  0.0.1-SNAPSHOT  securing-web-complete  Demo project for Spring Boot      17              org.springframework.boot      spring-boot-starter-thymeleaf              org.springframework.boot      spring-boot-starter-web              org.springframework.boot      spring-boot-starter-security              org.thymeleaf.extras      thymeleaf-extras-springsecurity6            3.1.1.RELEASE              org.springframework.security      spring-security-test      test              org.springframework.boot      spring-boot-starter-test      test      

以下安全配置(來自)可確保只有經過身份驗證的用戶才能看到秘密問候語:??src/main/java/com/example/securingweb/WebSecurityConfig.java??

package com.example.securingweb;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.core.userdetails.User;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.core.userdetails.UserDetailsService;import org.springframework.security.provisioning.InMemoryUserDetailsManager;import org.springframework.security.web.SecurityFilterChain;@Configuration@EnableWebSecuritypublic class WebSecurityConfig {  @Bean  public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {    http      .authorizeHttpRequests((requests) -> requests        .requestMatchers("/", "/home").permitAll()        .anyRequest().authenticated()      )      .formLogin((form) -> form        .loginPage("/login")        .permitAll()      )      .logout((logout) -> logout.permitAll());    return http.build();  }  @Bean  public UserDetailsService userDetailsService() {    UserDetails user =       User.withDefaultPasswordEncoder()        .username("user")        .password("password")        .roles("USER")        .build();    return new InMemoryUserDetailsManager(user);  }}

該類被注釋為啟用Spring Security的Web安全支持并提供Spring MVC集成。它還公開了兩個 bean 來設置 Web 安全配置的一些細節:??WebSecurityConfig????@EnableWebSecurity??

Bean 定義了哪些 URL 路徑應該受到保護,哪些不應該受到保護。具體而言,和 路徑配置為不需要任何身份驗證。所有其他路徑都必須經過身份驗證。??SecurityFilterChain????/????/home??

用戶成功登錄后,將重定向到之前請求的需要身份驗證的頁面。有一個自定義頁面(由 指定),每個人都可以查看它。??/login????loginPage()??

Bean 使用單個用戶設置內存中用戶存儲。該用戶的用戶名為 、 的密碼和 的角色。??UserDetailsService????user????password????USER??

現在您需要創建登錄頁面。視圖已經有一個視圖控制器,因此您只需創建登錄視圖本身,如以下清單(來自)所示:??login????src/main/resources/templates/login.html??

            Spring Security Example                 
Invalid username and password.
You have been logged out.

此百里香葉模板提供了一個表單,用于捕獲用戶名和密碼并將其發布到 .按照配置,Spring 安全性提供了一個過濾器,用于攔截該請求并對用戶進行身份驗證。如果用戶身份驗證失敗,頁面將重定向到 ,并且您的頁面將顯示相應的錯誤消息。成功注銷后,您的應用程序將發送到 ,并且您的頁面將顯示相應的成功消息。??/login????/login?error????/login?logout??

最后,您需要為訪問者提供一種顯示當前用戶名和注銷的方法。為此,請更新 以向當前用戶問好并包含一個表單,如以下列表 (from ) 所示:??hello.html????Sign Out????src/main/resources/templates/hello.html??

            Hello World!                

Hello thymeleaf!

我們使用Thymeleaf與Spring Security的集成來顯示用戶名。“注銷”表單將開機自檢提交到 。成功注銷后,它將用戶重定向到 。??/logout????/login?logout??

Thymeleaf 3.1 不再提供訪問,因此不能用于訪問當前經過身份驗證的用戶。??HttpServletRequest????HttpServletRequest#getRemoteUser()??

運行應用程序

Spring 初始化器會為您創建一個應用程序類。在這種情況下,您無需修改類。以下清單(來自 )顯示了應用程序類:??src/main/java/com/example/securingweb/SecuringWebApplication.java??

package com.example.securingweb;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class SecuringWebApplication {  public static void main(String[] args) throws Throwable {    SpringApplication.run(SecuringWebApplication.class, args);  }}

構建可執行的 JAR

您可以使用 Gradle 或 Maven 從命令行運行應用程序。您還可以構建一個包含所有必需依賴項、類和資源的可執行 JAR 文件并運行該文件。通過構建可執行 jar,可以輕松地在整個開發生命周期中跨不同環境等將服務作為應用程序進行交付、版本控制和部署。

如果使用 Gradle,則可以使用 .或者,您可以使用 JAR 文件生成 JAR 文件,然后運行該文件,如下所示:??./gradlew bootRun????./gradlew build??

java -jar build/libs/gs-securing-web-0.1.0.jar

如果使用 Maven,則可以使用 運行應用程序。或者,您可以使用 JAR 文件生成 JAR 文件,然后運行該文件,如下所示:??./mvnw spring-boot:run????./mvnw clean package??

java -jar target/gs-securing-web-0.1.0.jar

此處描述的步驟將創建一個可運行的 JAR。你也可以構建經典 WAR 文件.

應用程序啟動后,將瀏覽器指向 。您應該會看到主頁,如下圖所示:??http://localhost:8080??

當您單擊該鏈接時,它會嘗試將您帶到 的問候頁面。但是,由于該頁面是安全的,并且您尚未登錄,因此它會將您帶到登錄頁面,如下圖所示:??/hello??

如果您使用不安全的版本跳到此處,則看不到登錄頁面。您應該備份并編寫其余的基于安全性的代碼。

在登錄頁面上,分別輸入用戶名和密碼字段,以測試用戶身份登錄。提交登錄表單后,您將進行身份驗證,然后轉到問候頁面,如下圖所示:??user????password??

如果單擊“注銷”按鈕,您的身份驗證將被撤銷,并且您將返回到登錄頁面,并顯示一條消息,指示您已注銷

總結

祝賀!您已經開發了一個簡單的 Web 應用程序,該應用程序使用 Spring 安全性進行保護。

標簽: 應用程序 身份驗證 如下圖所示

上一篇:使用指針來完成三個數由大到小輸出(簡單指針的應用)
下一篇:今日要聞!TypeScript 前端工程最佳實踐