|
|
|
@ -0,0 +1,130 @@
|
|
|
|
|
package com.example.api.utils;
|
|
|
|
|
|
|
|
|
|
import io.jsonwebtoken.Claims;
|
|
|
|
|
import io.jsonwebtoken.ExpiredJwtException;
|
|
|
|
|
import io.jsonwebtoken.Jwts;
|
|
|
|
|
import io.jsonwebtoken.SignatureAlgorithm;
|
|
|
|
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.logging.Logger;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* JwtTokenUtil 类用于处理 JSON Web Tokens (JWT)。
|
|
|
|
|
* 此类提供生成、解析和验证 JWT 的功能。
|
|
|
|
|
*/
|
|
|
|
|
public final class JwtTokenUtil {
|
|
|
|
|
// 在请求的 header 中的名字
|
|
|
|
|
public final static String TOKEN_HEADER = "Authorization";
|
|
|
|
|
|
|
|
|
|
// 一个星期过期的时间(毫秒)
|
|
|
|
|
public final static long REMEMBER_EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 7;
|
|
|
|
|
|
|
|
|
|
// 一天过期的时间(毫秒)
|
|
|
|
|
public final static long EXPIRATION_TIME = 1000 * 60 * 60 * 24;
|
|
|
|
|
|
|
|
|
|
// 应用密钥,用于 JWT 签名
|
|
|
|
|
private static final String APP_SECRET = "logisticapi";
|
|
|
|
|
|
|
|
|
|
// JWT 前缀
|
|
|
|
|
private static final String PREFIX = "logistics:";
|
|
|
|
|
|
|
|
|
|
// 角色权限声明的键
|
|
|
|
|
private static final String ROLE_CLAIMS = "roles";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 检查 token 是否合法。
|
|
|
|
|
* @param token 要检查的 token
|
|
|
|
|
* @return 如果 token 非空且以 PREFIX 开头,则返回 true,否则返回 false。
|
|
|
|
|
*/
|
|
|
|
|
public static boolean checkToken(String token) {
|
|
|
|
|
if ("null".equals(token) || token == null || "".equals(token)){
|
|
|
|
|
System.out.println("token为空");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return token.startsWith(PREFIX);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成 Token。
|
|
|
|
|
* @param username 用户名
|
|
|
|
|
* @param roles 用户角色数组
|
|
|
|
|
* @param expiration 过期时间(毫秒)
|
|
|
|
|
* @return 生成的 JWT
|
|
|
|
|
*/
|
|
|
|
|
public static String createToken(String username, String[] roles, long expiration) {
|
|
|
|
|
System.out.println("---------------------------");
|
|
|
|
|
System.out.println("username:"+username);
|
|
|
|
|
System.out.println("-----------------------");
|
|
|
|
|
Map<String, Object> map = new HashMap<>();
|
|
|
|
|
map.put(ROLE_CLAIMS, roles);
|
|
|
|
|
return PREFIX + Jwts.builder()
|
|
|
|
|
.setClaims(map)
|
|
|
|
|
.setIssuedAt(new Date())
|
|
|
|
|
.setExpiration(new Date(System.currentTimeMillis() + expiration))
|
|
|
|
|
.signWith(SignatureAlgorithm.HS256, APP_SECRET)
|
|
|
|
|
.setSubject(username)
|
|
|
|
|
.compact();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取 token body。
|
|
|
|
|
* @param token 要解析的 token
|
|
|
|
|
* @return token 中的 claims 对象
|
|
|
|
|
*/
|
|
|
|
|
private static Claims getTokenClaims(String token) {
|
|
|
|
|
token = token.substring(PREFIX.length());
|
|
|
|
|
Claims claims = null;
|
|
|
|
|
try {
|
|
|
|
|
claims = Jwts.parser()
|
|
|
|
|
.setSigningKey(APP_SECRET)
|
|
|
|
|
.parseClaimsJws(token)
|
|
|
|
|
.getBody();
|
|
|
|
|
} catch (ExpiredJwtException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
return claims;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 从 Token 中获取用户名。
|
|
|
|
|
* @param token 要解析的 token
|
|
|
|
|
* @return token 中的用户名
|
|
|
|
|
*/
|
|
|
|
|
public static String getUsername(String token) {
|
|
|
|
|
System.out.println("----gettoken----");
|
|
|
|
|
System.out.println(getTokenClaims(token));
|
|
|
|
|
System.out.println("-------------");
|
|
|
|
|
System.out.println(getTokenClaims(token).getSubject());
|
|
|
|
|
System.out.println("-------------");
|
|
|
|
|
return getTokenClaims(token).getSubject();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 从 Token 中获取用户角色。
|
|
|
|
|
* @param token 要解析的 token
|
|
|
|
|
* @return token 中的用户角色列表
|
|
|
|
|
*/
|
|
|
|
|
public static List<String> getTokenRoles(String token) {
|
|
|
|
|
List<String> roles = new ArrayList<>();
|
|
|
|
|
Object object = getTokenClaims(token).get(ROLE_CLAIMS);
|
|
|
|
|
if (object instanceof ArrayList<?>) {
|
|
|
|
|
for (Object o : (List<?>) object) {
|
|
|
|
|
roles.add((String) o);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (String role : roles) {
|
|
|
|
|
System.out.println(role);
|
|
|
|
|
}
|
|
|
|
|
return roles;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 校验 Token 是否过期。
|
|
|
|
|
* @param token 要检查的 token
|
|
|
|
|
* @return 如果 token 已过期,则返回 true,否则返回 false。
|
|
|
|
|
*/
|
|
|
|
|
public static boolean isExpiration(String token) {
|
|
|
|
|
return getTokenClaims(token).getExpiration().before(new Date());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|