Spring Boot 3 整合 JWT(JSON Web Tokens)用于登录开发涉及多个步骤。JWT 是一种开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。这些信息可以被验证和信任,因为它们是数字签名的。
以下是一个简单的步骤指南,用于在 Spring Boot 3 应用中整合 JWT:
1. 添加依赖
首先,在你的 pom.xml
文件中添加 Spring Boot Web 和 JWT 相关的依赖:
<dependencies>
<!-- Spring Boot Web Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- JWT Library, 例如 jjwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>你的jjwt版本号</version>
</dependency>
<!-- 其他依赖 -->
</dependencies>
2. 配置 JWT
创建一个配置类,配置 JWT 的密钥和有效期等:
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JwtConfig {
public static final String SECRET_KEY = "你的密钥"; // 生产环境中请确保此密钥的安全性
public static final long JWT_EXPIRATION_MS = 86400000; // 24小时
@Bean
public SignatureAlgorithm signatureAlgorithm() {
return SignatureAlgorithm.HS512; // 使用HS512算法
}
}
在application.properties
或application.yml
文件中配置JWT相关的属性,如密钥、过期时间等。
jwt:
secret: your-secret-key
expiration: 86400000 # 1天,单位:毫秒
3. 创建 JWT 工具类
创建一个工具类,用于生成和验证 JWT:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.function.Function;
@Component
public class JwtTokenUtil {
@Autowired
private SignatureAlgorithm signatureAlgorithm;
public String generateToken(String userId) {
Date now = new Date();
Date expirationDate = new Date(now.getTime() + JwtConfig.JWT_EXPIRATION_MS);
return Jwts.builder()
.setClaims(getClaims(userId))
.setExpiration(expirationDate)
.signWith(signatureAlgorithm, JwtConfig.SECRET_KEY)
.compact();
}
private Claims getClaims(String userId) {
return Jwts.claims().setId(userId);
}
public String getUserIdFromToken(String token) {
Claims claims = getAllClaimsFromToken(token);
return claims.getId();
}
public boolean validateToken(String token, String userId) {
final String userIdFromToken = getUserIdFromToken(token);
return (userIdFromToken != null && userId.equals(userIdFromToken));
}
private Claims getAllClaimsFromToken(String token) {
Claims claims;
try {
claims = Jwts.parser()
.setSigningKey(JwtConfig.SECRET_KEY)
.parseClaimsJws(token)
.getBody();
} catch (SignatureException e) {
claims = null;
}
return claims;
}
}
4. 创建登录接口
在你的 Controller 中,创建处理登录请求的接口:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/auth")
public class AuthController {
@Autowired
private AuthService authService;
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
String token = authService.login(loginRequest);
return ResponseEntity.ok(new TokenResponse(token));
}
}