代码实现:
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 token
public 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
匹配,从而判断用户是否有权限。
使用说明: