在现代 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 令牌。
- 一旦凭据和令牌匹配成功,它们就可以登录数据库。
项目实现
步骤 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 层
创建一个