iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
Mobile Development

Spring Boot+Android 30天 實戰開發 系列 第 21

【Day - 21】Spring Security 6.1.x:實現基本認證(Basic Authentication)

  • 分享至 

  • xImage
  •  

1. 引言

當今的 Web 應用程式經常需要處理大量的使用者數據和機密信息。因此,確保應用程式的安全性變得至關重要。安全性不僅涉及保護使用者的數據,還包括防止未經授權的訪問和應對各種潛在的威脅。

在這樣的情況下,Spring Security 成為了 Java 開發者的強大工具。Spring Security 是一個強大的框架,專為處理身份驗證和授權而設計。它提供了一系列的功能和工具,用於確保您的應用程式免受各種安全漏洞的侵害,同時提供了可靠的身份驗證機制,確保只有授權使用者可以訪問特定資源。

本文將深入探討 Spring Security 6.x 中的基本認證。我們將從基本的概念開始,逐步引導您了解如何在 Spring Boot 應用程式中實現基本認證。我們還將討論如何自訂認證流程,以滿足您的應用程式需求。最後,我們將介紹角色和權限管理的概念,以確保您的應用程式只允許授權的使用者訪問特定資源。

2. 基本認證概述

基本認證(Basic Authentication)是一種用於保護網路應用程式的簡單而基本的身份驗證方法。它通常用於對一些敏感的資源或端點進行保護,以確保只有經過授權的使用者可以訪問這些資源。

工作原理:

  • 客戶端向伺服器發送一個請求,要求訪問某個受保護的資源,例如一個網頁或 API 端點。
  • 伺服器接收到請求後,如果該資源需要進行基本認證,則伺服器會返回一個"未授權的響應",並在響應標頭中包含一個 "WWW-Authenticate" 頭。
    圖片無法顯示

上圖顯示了伺服器向未經身份驗證的客戶端發送 "WWW-Authenticate" 頭的過程。

  • 客戶端收到"未授權響應"後,會彈出一個登錄對話框,要求使用者輸入使用者名和密碼。
  • 使用者在對話框中輸入使用者名和密碼後,客戶端將這些憑據與伺服器的基本認證要求進行匹配。
  • 如果使用者名和密碼匹配成功,客戶端會將這些憑據放在每個後續請求的 "Authorization" 標頭中,通過伺服器的要求進行身份驗證。

安全性和局限性:
基本認證是一種簡單的身份驗證方法,但它有一些局限性:

  • 安全性限制: 基本認證的使用者名和密碼以明文形式傳遞,因此容易受到窺探攻擊。為了增加安全性,應該使用 HTTPS 來加密通信。
  • 一次性認證: 基本認證是一次性的,每次請求都需要提供使用者名和密碼。這可能會導致多次的使用者名和密碼輸入,對使用者體驗造成負面影響。
  • 伺服器端存儲: 伺服器需要存儲使用者的密碼或密碼的哈希值,這可能存在風險,特別是如果伺服器的安全性受到威脅。

儘管有這些局限性,基本認證仍然是一種簡單而常見的身份驗證方法,特別是在一些不敏感的應用程式中,或用於快速原型開發。在Spring Security中,您可以輕鬆配置和使用基本認證,以確保您的應用程式具有基本的安全性。

Spring Security 中的 Basic Authentication:
Spring Security 提供了對 Basic Authentication 的支持,允許您在應用程式中輕鬆實現基本認證。在Spring Security中,當一個未經身份驗證的請求嘗試訪問受保護的資源時,伺服器會返回一個 "WWW-Authenticate" 頭,要求客戶端提供使用者名和密碼。一旦客戶端提供了這些憑據,Spring Security 將協助驗證這些憑據,並根據驗證結果允許或拒絕訪問。

在Spring Security中,您可以輕鬆配置和使用基本認證,以確保您的應用程式具有基本的安全性。為了實現基本認證,您需要配置適當的 Spring Security 過濾器,以處理 Basic Authentication 的相關操作。稍後的節點將深入介紹如何在Spring Boot應用程式中配置基本認證。

3. Spring Security 基本認證配置&實現

在這一節中,我們將探討如何在 Spring Boot 應用程式中配置 Spring Security 以實現基本認證。基本認證是一種常見的身份驗證方法,通常用於保護網路應用程式中的受限資源。

步驟1:添加 Spring Security 依賴

首先,您需要確保在您的 Spring Boot 項目中添加了 Spring Security 的相關依賴。您可以在專案的pom.xml文件中添加以下依賴:

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

這個依賴將引入 Spring Security 相關的類庫和設定,讓您可以開始配置身份驗證和授權。

步驟2:配置基本認證

在 Spring Security 中,您可以通過配置適當的過濾器來啟用和配置基本認證。以下是一個簡單的配置示例

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(new Customizer<AuthorizeHttpRequestsConfigurer<org.springframework.security.config.annotation.web.builders.HttpSecurity>.AuthorizationManagerRequestMatcherRegistry>() {
                @Override
                public void customize(AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry authorizationManagerRequestMatcherRegistry) {
                    authorizationManagerRequestMatcherRegistry
                        .requestMatchers("/public/**").permitAll() // 允許公開訪問的路徑
                        .requestMatchers("/private/**").authenticated(); // 需要驗證的路徑
                }
        })
        .httpBasic(Customizer.withDefaults());
        return http.build();
    }
}

上述配置示例中,我們使用 configure 方法來定義哪些路徑需要驗證,哪些路徑允許公開訪問。對於需要驗證的路徑,我們使用 .httpBasic() 啟用了基本認證。

4. 角色權限管理

在本節中,我們將探討如何在 Spring Security 中實現角色和權限管理。這是應用程式安全性的重要方面,允許您細粒度地控制使用者對資源的訪問權限。

步驟1:配置角色和權限

Spring Security 允許您通過配置來指定哪些角色和權限可以訪問特定的資源。以下是一個簡單的示例:

@Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http. //省略其他配置
            authorizeHttpRequests(authorizationManagerRequestMatcherRegistry -> {
                authorizationManagerRequestMatcherRegistry
                    .requestMatchers("/public/**").permitAll() // 允許公開訪問的路徑
                    .requestMatchers("/private/**").hasRole("USER") // 需要 USER 角色
                    .requestMatchers("/admin/**").hasRole("ADMIN"); // 需要 ADMIN 角色
            })
            .httpBasic(Customizer.withDefaults()); // 使用 HTTP Basic 認證
        return http.build();

在上述示例中,我們使用hasRole()方法指定了哪些角色可以訪問某些路徑。使用者需要具有相應的角色才能成功通過授權。

步驟2:設定使用者角色

為了使角色和權限管理生效,您需要定義使用者角色並分配給使用者。以下是一個示例:

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 在實際應用中,您可以從資料庫或其他存儲中加載使用者信息
        // 這裡簡單起見,我們創建一個使用者
        UserDetails user = User.builder()
            .username("user")
            .password("{noop}password") // {noop} 表示不使用密碼編碼器
            .roles("USER") // 分配 USER 角色
            .build();
        return user;
    }
}

在上述示例中,我們實現了自定義的 UserDetailsService 並在 loadUserByUsername 方法中定義了使用者信息。該使用者被分配了 USER 角色。

步驟3:保護資源

現在,您的應用程式已經配置了角色和權限,並定義了使用者的角色。接下來,您可以根據這些角色來保護資源。以下是一個示例:

@RestController
public class ResourceController {

    @GetMapping("/public/resource")
    public String publicResource() {
        return "This is a public resource.";
    }

    @GetMapping("/private/resource")
    public String privateResource() {
        return "This is a private resource.";
    }

    @GetMapping("/admin/resource")
    public String adminResource() {
        return "This is an admin resource.";
    }
}

在上述示例中,我們創建了三個不同的資源端點,分別是公共資源、私有資源和管理資源。根據之前的配置,只有擁有相應角色的使用者才能訪問這些資源。

5. 總結

在本文中,我們簡單的探討了 Spring Security 6.x 中的基本認證和角色權限管理。我們首先了解了基本認證的概念,並看到它如何提供一種簡單而有效的方式來保護您的應用程式資源。通過使用 HTTP Basic Authentication,您的應用程式可以要求使用者提供有效的使用者名和密碼,以確保只有授權的使用者可以訪問受保護的資源。

我們還討論了 Spring Security 中的角色和權限管理。通過配置角色和權限,您可以實現細粒度的控制,確保只有具有特定角色的使用者才能執行某些操作或訪問某些資源。我們看到如何配置角色和權限以及如何分配給使用者。

總的來說,Spring Security 6.x 提供了一個強大的框架,用於實現應用程式的安全性需求。無論是基本認證還是角色權限管理,它都為您提供了靈活而可擴展的解決方案,以確保您的應用程式在保護資源方面具有良好的性能和安全性。


上一篇
【Day - 20】Spring Boot 集成 Thymeleaf構建動態Web應用 (下)
下一篇
【Day - 22】Spring Security 6.1.x:實現JWT身份驗證 (上)
系列文
Spring Boot+Android 30天 實戰開發 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言