基于 Spring Boot + Spring Security + JWT,本文提供一个完整的 Access Token + Refresh Token 认证实现方案,涵盖从登录认证、刷新 Token、登出,到安全优化的全流程,适用于生产环境。
一、架构概览
项目结构
src/main/java/com/example/auth/ ├── AuthApplication.java # 主应用类 ├── config/ │ ├── SecurityConfig.java # 安全配置 │ └── WebConfig.java # Web配置 ├── controller/ │ └── AuthController.java # 认证控制器 ├── dto/ │ ├── LoginRequest.java # 登录请求DTO │ ├── TokenRefreshRequest.java # Token刷新请求DTO │ └── ApiResponse.java # 统一响应DTO ├── entity/ │ ├── User.java # 用户实体 │ └── RefreshToken.java # Refresh Token实体 ├── repository/ │ ├── UserRepository.java # 用户仓库 │ └── RefreshTokenRepository.java # Refresh Token仓库 ├── security/ │ ├── JwtTokenProvider.java # JWT Token提供者 │ ├── JwtAuthenticationFilter.java # JWT认证过滤器 │ └── UserPrincipal.java # 用户主体 ├── service/ │ ├── UserService.java # 用户服务 │ ├── RefreshTokenService.java # Refresh Token服务 │ └── AuthService.java # 认证服务 └── exception/ ├── TokenRefreshException.java # Token刷新异常 └── GlobalExceptionHandler.java # 全局异常处理二、核心实现
1. 实体类
用户和 Refresh Token 实体:
@Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(unique = true, nullable = false) private String username; private String password; private String email; private String role = "USER"; private boolean enabled = true; // getters/setters ... }@Entity @Table(name = "refresh_tokens") public class RefreshToken { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false, unique = true) private String token; @ManyToOne(fetch = FetchType.LAZY) private User user; @Column(nullable = false) private Lo