使用 Java JJWT 实现 Token 放行流程
在现代的 web 应用中,认证和授权是重要的内容。JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境中以一种紧凑和自包含的方式安全地传递信息。JJWT 是一个流行的 Java 库,用于生成和验证 JWT。本文将详细介绍如何使用 JJWT 库在 Java 中实现 JWT 的放行功能。
整体流程
我们可以将 JWT 的放行流程分为以下几个步骤:
步骤 | 描述 |
---|---|
1 | 添加 JJWT 依赖 |
2 | 创建 JWT 生成器 |
3 | 生成 JWT |
4 | 创建 JWT 验证器 |
5 | 验证 JWT |
6 | 放行用户请求 |
步骤详解
1. 添加 JJWT 依赖
首先,我们需要在项目中添加 JJWT 依赖。如果你使用 Maven,添加以下内容到 pom.xml
文件中:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
2. 创建 JWT 生成器
我们需要一个方法来生成 JWT。下面是一个简单的示例:
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
public class TokenProvider {
private String secretKey = "mySecretKey"; // 请使用更强的密钥
// 生成 JWT 方法
public String createToken(String username) {
return Jwts.builder()
.setSubject(username) // 设置主题(用户凭证)
.signWith(SignatureAlgorithm.HS256, secretKey) // 使用 HMAC SHA256 签名
.compact(); // 生成 JWT
}
}
代码解释:
secretKey
: 用于签名 JWT 的密钥,应存储安全,防止泄露。createToken
: 接受用户名并生成 JWT。
3. 生成 JWT
可以通过简单的主程序(main 方法)来测试 JWT 的生成:
public class Main {
public static void main(String[] args) {
TokenProvider tokenProvider = new TokenProvider();
String token = tokenProvider.createToken("user123");
System.out.println("Generated Token: " + token);
}
}
4. 创建 JWT 验证器
在收到请求时,我们需要验证 token 的有效性:
public class TokenVerifier {
private String secretKey = "mySecretKey";
// 验证 JWT 方法
public String verifyToken(String token) {
try {
return Jwts.parser()
.setSigningKey(secretKey) // 设置签名密钥
.parseClaimsJws(token) // 解析 token
.getBody().getSubject(); // 返回主体
} catch (Exception e) {
return null; // 验证失败
}
}
}
代码解释:
verifyToken
: 接受 JWT token 并返回与之关联的用户名,如果验证失败则返回 null。
5. 验证 JWT
使用 TokenVerifier
类来进行验证:
public class Main {
public static void main(String[] args) {
TokenProvider tokenProvider = new TokenProvider();
TokenVerifier tokenVerifier = new TokenVerifier();
String token = tokenProvider.createToken("user123");
String verifiedUsername = tokenVerifier.verifyToken(token);
if (verifiedUsername != null) {
System.out.println("Token is valid for user: " + verifiedUsername);
} else {
System.out.println("Invalid token!");
}
}
}
6. 放行用户请求
最后,我们需要在网络请求中使用这些逻辑。在 Spring Boot 中,这通常体现在过滤器中。下面是一个简单的过滤器示范:
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class JwtAuthenticationFilter extends OncePerRequestFilter {
private TokenVerifier tokenVerifier = new TokenVerifier();
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain)
throws ServletException, java.io.IOException {
String token = request.getHeader("Authorization");
if (token != null && tokenVerifier.verifyToken(token) != null) {
// 放行请求
filterChain.doFilter(request, response);
return;
}
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
}
}
Mermaid序列图
下面是用 Mermaid 语法生成的序列图,描述了用户如何通过 JWT 实现放行。
sequenceDiagram
participant User
participant Server
User->>Server: 发送请求,包含Token
Server->>Server: 验证Token
alt 验证通过
Server->>User: 响应数据
else 验证失败
Server->>User: 返回未授权状态
end
Mermaid类图
下面是用 Mermaid 语法生成的类图,描述了 JWT 生成和验证的类结构。
classDiagram
class TokenProvider {
+String createToken(String username)
}
class TokenVerifier {
+String verifyToken(String token)
}
class JwtAuthenticationFilter {
+doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
}
TokenProvider --> TokenVerifier
JwtAuthenticationFilter --> TokenVerifier
结尾
通过本文,我们详细讨论了如何在 Java 中使用 JJWT 库实现 JWT 的生成与验证,最终达到对用户请求的放行。掌握这些步骤后,你将能够为你的应用程序实现一个安全的身份验证机制。结合这些技能和你在开发中的实践经验,一定会对你进一步的学习和实践大有裨益。希望这篇文章对你有帮助!