Spring Boot整合JWT:实现安全高效的API认证之旅

一、引言
随着互联网的快速发展,API已经成为企业服务的重要方式。为了确保API的安全性,我们通常会采用JWT(JSON Web Token)技术进行身份认证。本文将深入探讨如何将Spring Boot与JWT技术相结合,实现安全高效的API认证。
二、JWT简介
JWT是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它将认证信息加密后,以JSON格式存储在一段字符串中。JWT具有以下特点:
1. 自包含:JWT包含了所有认证信息,无需额外的数据库或缓存支持。
2. 无需服务器存储:JWT可以在客户端存储,降低服务器压力。
3. 无需轮询:JWT的过期时间可以自定义,无需不断轮询服务器获取新令牌。
三、Spring Boot整合JWT
1. 添加依赖
在Spring Boot项目中,我们需要添加以下依赖:
```xml
```
2. 创建JWT工具类
```java
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class JwtUtil {
private static final String SECRET_KEY = "your_secret_key"; // 密钥
public String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + 60 * 60 * 1000)) // 1小时后过期
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public Claims parseToken(String token) {
return Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody();
}
}
```
3. 创建认证控制器
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AuthController {
@Autowired
private JwtUtil jwtUtil;
@PostMapping("/login")
public String login(@RequestBody LoginRequest loginRequest) {
// 验证用户名和密码,此处省略具体实现
if (loginRequest.getUsername().equals("admin") && loginRequest.getPassword().equals("123456")) {
return jwtUtil.generateToken(loginRequest.getUsername());
}
return "认证失败";
}
}
```
4. 创建过滤器实现全局认证
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class JwtFilter extends OncePerRequestFilter {
@Autowired
private JwtUtil jwtUtil;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String token = request.getHeader("Authorization");
if (token != null && token.startsWith("Bearer ")) {
try {
Claims claims = jwtUtil.parseToken(token.substring(7));
if (claims != null) {
// 用户认证成功,放行
filterChain.doFilter(request, response);
return;
}
} catch (Exception e) {
// 用户认证失败,返回错误信息
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().write("认证失败");
return;
}
}
// 用户未认证,返回错误信息
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().write("认证失败");
}
}
```
5. 配置过滤器
在Spring Boot项目中,我们需要将过滤器注册到过滤器链中:
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Autowired
private JwtFilter jwtFilter;
@Bean
public FilterRegistrationBean
FilterRegistrationBean
registrationBean.setFilter(jwtFilter);
registrationBean.addUrlPatterns("/api/*"); // 拦截所有/api/开头的请求
return registrationBean;
}
}
```
四、总结
本文详细介绍了Spring Boot整合JWT的过程,包括JWT简介、添加依赖、创建JWT工具类、创建认证控制器、创建过滤器实现全局认证以及配置过滤器。通过本文的学习,相信您已经掌握了如何在Spring Boot项目中实现安全高效的API认证。






