在Spring Boot中實現OAuth2.0認證

省赚客开发者团队發表於2024-07-20

在Spring Boot中實現OAuth2.0認證

大家好,我是微賺淘客系統3.0的小編,是個冬天不穿秋褲,天冷也要風度的程式猿!

OAuth2.0 是一種用於授權的協議,它使得使用者可以授權第三方應用程式訪問他們在某服務提供商上的資源,而無需共享他們的憑據。Spring Boot 提供了對 OAuth2.0 的原生支援,可以方便地將其整合到應用程式中。本文將詳細介紹如何在 Spring Boot 中實現 OAuth2.0 認證。

1. 建立 Spring Boot 專案

首先,我們需要建立一個 Spring Boot 專案,並新增所需的依賴項。在 pom.xml 中新增以下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. 配置 OAuth2.0 客戶端

application.yml 檔案中配置 OAuth2.0 客戶端資訊。假設我們要整合 Google 作為認證提供者:

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: your-client-id
            client-secret: your-client-secret
            scope: profile, email
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
            authorization-grant-type: authorization_code
        provider:
          google:
            authorization-uri: https://accounts.google.com/o/oauth2/auth
            token-uri: https://oauth2.googleapis.com/token
            user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
            user-name-attribute: sub

在這個配置中,client-idclient-secret 是在 Google API 控制檯中建立 OAuth2.0 客戶端時獲得的。redirect-uri 是使用者授權後 Google 重定向到的 URI。

3. 建立安全配置

建立一個配置類來設定 Spring Security 的 OAuth2.0 認證:

package cn.juwatech.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.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/login**").permitAll()
                .anyRequest().authenticated()
                .and()
            .oauth2Login()
                .defaultSuccessURL("/home", true)
                .failureUrl("/login?error")
                .and()
            .logout()
                .logoutSuccessUrl("/");
    }
    
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
                .authorizeRequests(authorizeRequests ->
                    authorizeRequests
                        .antMatchers("/", "/login**").permitAll()
                        .anyRequest().authenticated()
                )
                .oauth2Login(withDefaults())
                .build();
    }
}

在這個配置中,oauth2Login() 方法啟用 OAuth2.0 登入,並配置了登入成功和失敗的重定向 URL。所有請求都要求使用者經過身份驗證,除非訪問根路徑或登入路徑。

4. 建立控制器

建立一個簡單的控制器來處理應用的主頁面和登入成功後的頁面:

package cn.juwatech.controller;

import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MainController {

    @RequestMapping("/")
    public String index() {
        return "index";
    }

    @GetMapping("/home")
    @ResponseBody
    public String home(Authentication authentication) {
        return "Welcome, " + authentication.getName();
    }
}

/home 路徑是使用者登入成功後的重定向地址,authentication.getName() 可以獲取當前登入使用者的資訊。

5. 建立檢視

src/main/resources/templates 目錄下建立 index.htmlhome.html 檔案,用於展示應用的主頁和使用者資訊頁面。以下是 index.html 的示例:

<!DOCTYPE html>
<html>
<head>
    <title>OAuth2.0 Login</title>
</head>
<body>
    <h1>Welcome to the OAuth2.0 Demo</h1>
    <a href="/oauth2/authorization/google">Login with Google</a>
</body>
</html>

在這個檢視中,我們建立了一個登入連結,當使用者點選時會重定向到 Google 的登入頁面。

6. 執行與測試

現在,可以執行 Spring Boot 應用程式,並在瀏覽器中訪問 http://localhost:8080。點選 "Login with Google" 連結將重定向到 Google 登入頁面。成功登入後,使用者將被重定向到 /home 路徑,顯示歡迎資訊。

7. 總結

透過以上步驟,我們在 Spring Boot 中成功實現了 OAuth2.0 認證。配置 OAuth2.0 客戶端、設定 Spring Security 的 OAuth2.0 配置、建立控制器和檢視都是實現這一認證流程的關鍵步驟。使用 Spring Boot 和 OAuth2.0,可以輕鬆實現安全的使用者認證和授權功能。

本文著作權歸聚娃科技微賺淘客系統開發者團隊,轉載請註明出處!

相關文章