代码实现:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;public class JwtAuthExample {// 密钥,应该保存在安全的地方,这里仅作示例private static final String SECRET_KEY = "yourSecretKey"; // token 过期时间,单位:毫秒private static final long EXPIRATION_TIME = 3600000; // 生成 JWT tokenpublic static String generateToken(String subject, String role) {return Jwts.builder().setSubject(subject).claim("role", role) // 添加角色信息,用于鉴权.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)).signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();}// 验证 JWT token 并提取角色信息public static String validateToken(String token) {try {Claims claims = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();String subject = claims.getSubject();String role = (String) claims.get("role");System.out.println("Subject: " + subject);System.out.println("Role: " + role);return role;} catch (Exception e) {System.out.println("Invalid token");return null;}}// 检查用户是否有权限public static boolean hasPermission(String token, String requiredRole) {String userRole = validateToken(token);if (userRole == null) {return false;}return userRole.equals(requiredRole);}public static void main(String[] args) {String subject = "exampleUser";String role = "admin";String token = generateToken(subject, role);System.out.println("Generated Token: " + token);String extractedRole = validateToken(token);System.out.println("Extracted Role: " + extractedRole);boolean hasPermission = hasPermission(token, "admin");System.out.println("Has Permission: " + hasPermission);}
}
代码解释:
SECRET_KEY:这是一个用于签名和验证 JWT 的密钥,在实际应用中应该存储在安全的地方,不能直接硬编码在代码中。EXPIRATION_TIME:定义了 JWT token 的过期时间,这里设置为 1 小时(3600000 毫秒)。generateToken 方法: - 使用
Jwts.builder() 创建一个 JWT 构建器。 setSubject(subject):设置 JWT 的主题,通常是用户的唯一标识符,例如用户 ID 或用户名。claim("role", role):添加一个自定义的 role 声明,用于存储用户的角色信息,以便后续鉴权使用。setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)):设置 token 的过期时间为当前时间加上 EXPIRATION_TIME。signWith(SignatureAlgorithm.HS256, SECRET_KEY):使用 HS256 算法和 SECRET_KEY 对 JWT 进行签名。compact():将构建好的 JWT 压缩成最终的 token 字符串。
validateToken 方法: - 使用
Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody() 解析并验证 token。 claims.getSubject():提取 JWT 的主题。claims.get("role"):提取存储在 role 声明中的角色信息。- 如果解析过程中出现异常,将打印 "Invalid token" 并返回
null。
hasPermission 方法: - 调用
validateToken(token) 验证 token 并提取角色信息。 - 检查提取的角色是否与所需的角色
requiredRole 匹配,从而判断用户是否有权限。
使用说明: