Spring Security 实现 OAuth2:分步实战指南

OAuth2 是一个授权框架,它使第三方应用程序(如 Google、GitHub 或 Facebook 等 HTTP 服务)能够安全且有限地访问用户资源。它允许用户授权第三方应用访问其数据,而无需向这些应用透露自己的账号密码。

在本指南中,我们将一起探索如何将 OAuth2 与 Spring Boot 和 Spring Security 集成,以实现通过 Google 等 OAuth2 提供商进行安全登录和访问控制的功能。

什么是 OAuth2?

OAuth2 (Open Authorization 2.0) 是一个框架,允许应用程序访问托管在外部服务上的用户数据,而无需用户分享他们的密码。取而代之的是,用户通过服务提供商颁发的令牌来授权访问。

OAuth2 的核心组件

  • 资源拥有者: 授权访问其数据的用户。
  • 客户端: 请求访问用户账户的应用程序。
  • 授权服务器: 验证用户身份并颁发访问令牌的服务器。
  • 资源服务器: 托管受保护资源并验证访问令牌的服务器。

OAuth2 授权流程

OAuth2 根据应用程序类型定义了多种流程:

  • 授权码模式: 常用于服务器端应用程序。客户端首先接收一个授权码,然后将其交换为访问令牌。
  • 简化模式: 用于客户端(基于浏览器)应用程序,其中访问令牌直接返回,无需授权码交换。
  • 密码模式: 当客户端可以直接从资源拥有者处请求凭据时使用(仅限受信任的应用程序)。
  • 客户端凭据模式: 当客户端访问其自己的资源而非用户的资源时使用。

前置准备:

  • 对 Spring Boot 和 Spring Security 有较好的理解
  • 已安装 JDK 17
  • IntelliJ IDEA 或任何其他 IDE
  • Google Cloud Console 账号(用于 OAuth 客户端设置)
  • Maven 用于依赖管理

实现步骤

第 1 步:创建一个新的 Spring Boot 项目

让我们创建一个 Spring Boot 项目,配置如下:

  • 项目名称: oauth2-spring-security
  • 语言: Java
  • 类型: Maven
  • 打包方式: Jar

!Project Metadata创建新项目

第 2 步:添加依赖项

让我们在 pom.xml 中添加以下依赖:

XML


CODEBLOCK_442a30ca

创建项目后,IDE 中的文件夹结构将如下图所示:

!Folder Structure项目结构

第 3 步:配置 application.properties

让我们添加以下 Google OAuth2 配置:

> spring.application.name=oauth2-spring-security

>

> spring.security.oauth2.client.registration.google.client-id=YOURGOOGLECLIENT_ID

>

> spring.security.oauth2.client.registration.google.client-secret=YOURGOOGLECLIENT_SECRET

>

> spring.security.oauth2.client.registration.google.redirect-uri=http://localhost:8080/login/oauth2/code/{registrationId}

>

> spring.security.oauth2.client.registration.google.scope=profile,email

第 4 步:创建用户模型

User.java:

Java


CODEBLOCK_910f8130

这个类定义了一个包含 name 和 email 字段的用户,并使用 Lombok 来减少样板代码。

第 5 步:创建服务类

这个服务类负责从 OAuth2User 数据创建 User 对象。

UserService.java:

Java

`

package com.gfg.oauth2springsecurity.service;

import com.gfg.oauth2springsecurity.model.User;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    public User createUser(OAuth2User oAuth2User) {
        User use
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/20589.html
点赞
0.00 平均评分 (0% 分数) - 0