Spring Boot 中的 JWT 认证与登录校验
在现代的 Web 应用中,认证和授权是至关重要的环节。JSON Web Token(JWT)是一种轻量级的身份验证机制,广泛应用于前后端分离的架构中。本文将介绍如何在 Spring Boot 项目中实现基于 JWT 的登录校验。
1. JWT 简介
JWT 是一种开放标准(RFC 7519),用于安全地在各方之间传递信息。JWT 由三部分组成:头部(Header)、有效负载(Payload)和签名(Signature)。这些组合成一个字符串,结构如下:
header.payload.signature
在身份验证场景中,JWT 可用于用户登录后,服务器生成一个包含用户信息的令牌返回给客户端,后续的请求中,客户端需要携带该令牌用于身份验证。
2. Spring Boot 项目设置
首先,确保你拥有一个 Spring Boot 项目,可以通过 Spring Initializr 创建一个新的项目,选择 Web 和 Spring Security 依赖。
2.1. 添加依赖
在 pom.xml
中添加 JWT 相关的依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.2. 创建 JWT 工具类
创建一个工具类 JwtUtil
来生成和解析 JWT:
import io.jsonwebtoken.*;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class JwtUtil {
private String SECRET_KEY = "secret"; // 密钥
private long EXPIRATION_TIME = 1000 * 60 * 60; // 1小时
// 生成 JWT
public String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
// 验证 JWT
public boolean validateToken(String token, String username) {
final String extractedUsername = extractUsername(token);
return (extractedUsername.equals(username) && !isTokenExpired(token));
}
// 从 JWT 中提取用户名
public String extractUsername(String token) {
return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();
}
// 检查 JWT 是否过期
private boolean isTokenExpired(String token) {
return extractExpiration(token).before(new Date());
}
private Date extractExpiration(String token) {
return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getExpiration();
}
}
2.3. 登录功能实现
创建一个简单的控制器 AuthController
来处理登录请求:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/auth")
public class AuthController {
@Autowired
private JwtUtil jwtUtil;
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
// 在实际项目中,这里应该进行用户校验,例如查询数据库
if ("user".equals(username) && "password".equals(password)) { // 假设有一个用户
return jwtUtil.generateToken(username);
} else {
throw new RuntimeException("用户名或密码错误");
}
}
}
2.4. 安全配置
接下来,需要配置 Spring Security,允许不需要认证的请求,比如登录请求:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/login").permitAll() // 允许不需要认证的路径
.anyRequest().authenticated(); // 其他请求需要认证
}
}
3. 总结
以上内容展示了如何在 Spring Boot 项目中实现基于 JWT 的登录校验。通过设置 JWT 工具类、控制器和安全配置,我们能够实现安全的用户认证机制。在实际应用中,建议结合数据库用户管理,并对 JWT 的存储和传递进行更全面的安全考虑。这样可以确保我们的应用在用户验证上安全可靠。