1. 添加依赖
首先,在你的pom.xml
中添加java-jwt
库的依赖项:
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.0.0</version>
</dependency>
2. JWT工具类
创建一个JwtUtil
工具类,用于生成和验证JWT。这个类还会包括对JWT的一些配置,如密钥、有效期等。
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
import java.util.Date;
public class JwtUtil {
// 秘钥,应该保密
private static final String SECRET_KEY = "your_secret_key";
// JWT的过期时间(单位:毫秒),这里设置为10分钟
private static final long EXPIRATION_TIME = 10 * 60 * 1000;
// 生成JWT
public static String generateToken(String username) {
return JWT.create()
.withSubject(username) // 设置主题为用户名
.withIssuedAt(new Date()) // 设置签发时间
.withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 设置过期时间
.sign(Algorithm.HMAC256(SECRET_KEY)); // 使用HMAC256算法签名
}
// 验证JWT
public static DecodedJWT verifyToken(String token) throws JWTVerificationException {
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET_KEY))
.build(); // 创建验证器
return verifier.verify(token); // 验证JWT并返回解码后的JWT
}
// 从JWT中提取用户名
public static String getUsernameFromToken(String token) {
DecodedJWT jwt = verifyToken(token);
return jwt.getSubject(); // 获取主题部分,也就是用户名
}
}
3. 用户登录与JWT生成
在用户成功登录后,生成并返回JWT。这里以一个模拟的用户服务类为例:
public class UserService {
// 模拟的用户数据存储
private static final Map<String, String> users = new HashMap<>();
static {
users.put("user1", "password1");
users.put("user2", "password2");
}
// 登录方法
public String login(String username, String password) {
// 验证用户名和密码是否正确
if (isValidUser(username, password)) {
// 如果验证通过,生成JWT
return JwtUtil.generateToken(username);
} else {
// 如果用户名或密码错误,抛出异常
throw new RuntimeException("Invalid username or password");
}
}
// 验证用户方法
private boolean isValidUser(String username, String password) {
return users.containsKey(username) && users.get(username).equals(password);
}
}
4. 保护受限资源
现在假设有一个受限的资源,只有在提供有效的JWT时才可以访问。我们可以通过拦截器或过滤器来验证每个请求中的JWT。
public class ProtectedResource {
public void accessResource(String token) {
try {
// 验证JWT
String username = JwtUtil.getUsernameFromToken(token);
System.out.println("Access granted to user: " + username);
// 执行受限操作
} catch (JWTVerificationException exception) {
// 如果JWT无效或过期,抛出异常
throw new RuntimeException("Invalid or expired token");
}
}
}
5. 示例应用
最后,假设你有一个主程序,它模拟了用户登录和访问受限资源的过程。
public class MainApplication {
public static void main(String[] args) {
UserService userService = new UserService();
ProtectedResource protectedResource = new ProtectedResource();
// 用户登录并获取JWT
String token = userService.login("user1", "password1");
System.out.println("Generated JWT: " + token);
// 使用JWT访问受限资源
protectedResource.accessResource(token);
}
}
关键点总结
- JWT生成:
JwtUtil.generateToken(String username)
生成JWT,包含了用户的标识和有效期。 - JWT验证:
JwtUtil.verifyToken(String token)
验证JWT的有效性,包括密钥匹配和过期检查。 - 应用场景:通过登录获取JWT,并在每次请求受限资源时携带JWT,以便服务器验证并确定权限。