深入理解 Spring Boot 中的 OAuth2 与 JWT 集成

在现代 Spring Boot 应用程序中,结合使用 JWT (JSON Web Token) 的 OAuth2 是一种广泛采用的认证机制。OAuth2 为 API 提供了安全的授权框架,而 JWT 则实现了客户端与服务器之间无状态的基于令牌的认证。它们共同构成了一种健壮且可扩展的安全解决方案。

OAuth2 (开放授权 2.0) 是一个授权框架,它允许应用程序在不共享用户凭据的情况下,安全地访问用户在另一项服务上的资源。

在认证成功后,它会向客户端颁发访问令牌。

核心角色:

  • Resource Owner (资源拥有者):授予访问权限的用户。
  • Client (客户端):请求访问权限的应用程序。
  • Authorization Server (授权服务器):验证用户身份并颁发令牌。
  • Resource Server (资源服务器):托管受保护的资源,并验证访问令牌。

JWT (JSON Web Token) 是一种紧凑且无状态的令牌格式,用于在各方之间安全地传输信息。

它包含三个部分:Header (头部)、Payload (有效负载) 和 Signature (签名)。

结构:

> Header.Payload.Signature

主要特性:

  • 使用 Base64 编码
  • 自包含(存储用户角色、过期时间等信息)
  • 使用密钥或私钥进行签名

OAuth2 与 JWT 在 Spring Boot 中如何协作

当它们结合在一起时,OAuth2 和 JWT 共同处理身份认证和授权:

  • 用户使用有效的凭据登录。
  • 授权服务器验证这些凭据并生成一个 JWT。
  • 客户端存储该 JWT。
  • 对于每一次请求,JWT 都会被放在 HTTP Authorization 头中发送。
  • 资源服务器在授予访问权限之前验证该令牌。

项目示例:

在这个项目中,我们将开发注册 API、登录 API 以及令牌生成器。

  • 一旦用户完成注册,用户名和密码详细信息将被存储在 MongoDB 数据库中。
  • 密码可以存储编码形式,同时可以生成 JWT。
  • 因此,用户可以登录并访问数据库,但它们需要提供用户凭据以及 JWT 令牌。
  • 一旦凭据和令牌匹配成功,它们就可以登录数据库。

!Auth with JWT

项目实现

步骤 1. 创建项目

使用 Spring Initializr 创建一个新的 Spring Boot 项目:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 3.3.4

项目结构:

!fileStructure项目结构图

步骤 2. 添加依赖项

在 pom.xml 文件中添加以下依赖项:

>

>

>

>

> org.springframework.boot

>

> spring-boot-starter-security

>

>

>

>

>

> org.springframework.boot

>

> spring-boot-starter-web

>

>

>

>

>

> org.springframework.boot

>

> spring-boot-starter-oauth2-resource-server

>

>

>

>

>

> org.springframework.security

>

> spring-security-oauth2-authorization-server

>

> 1.3.0

>

>

>

>

>

> org.springframework.boot

>

> spring-boot-starter-data-jpa

>

>

>

>

>

> com.h2database

>

> h2

>

> runtime

>

>

>

>

>

> org.projectlombok

>

> lombok

>

> true

>

>

>

>

步骤 3. 配置 application.properties

> spring.application.name=spring-oauth2-jwt-demo

>

>

>

> # H2 Database

>

> spring.datasource.url=jdbc:h2:mem:testdb

>

> spring.datasource.driver-class-name=org.h2.Driver

>

> spring.datasource.username=sa

>

> spring.datasource.password=

>

> spring.jpa.hibernate.ddl-auto=create-drop

>

> spring.h2.console.enabled=true

>

>

>

> # JWT Configuration

>

> jwt.secret=MyJwtSecretKey12345

>

> jwt.expiration=3600000

>

> server.port=8080

步骤 4. 实体类

创建一个 User 实体来存储凭据。

Java


CODEBLOCK_6c0c4e01

步骤 5. Repository 层

Java


CODEBLOCK_c92651c9

步骤 6. Service 层

创建一个

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