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 的存储和传递进行更全面的安全考虑。这样可以确保我们的应用在用户验证上安全可靠。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部