package com.linghu.utils;
|
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Component;
|
|
import com.linghu.model.entity.User;
|
|
import io.jsonwebtoken.Claims;
|
import io.jsonwebtoken.ExpiredJwtException;
|
import io.jsonwebtoken.Jwts;
|
import io.jsonwebtoken.MalformedJwtException;
|
import io.jsonwebtoken.SignatureAlgorithm;
|
import io.jsonwebtoken.UnsupportedJwtException;
|
import io.jsonwebtoken.security.Keys;
|
import io.jsonwebtoken.security.SignatureException;
|
|
import javax.crypto.SecretKey;
|
import java.util.Date;
|
import java.util.Map;
|
|
@Component
|
public class JwtUtils {
|
@Value("${jwt.secret}")
|
private final String secret;
|
|
@Value("${jwt.expiration}")
|
private final Long expiration;
|
|
// 生成安全的密钥
|
private SecretKey getSigningKey() {
|
return Keys.hmacShaKeyFor(secret.getBytes());
|
}
|
|
// 通过构造函数注入配置值
|
public JwtUtils(
|
@Value("${jwt.secret}") String secret,
|
@Value("${jwt.expiration}") long expiration) {
|
|
this.secret = secret;
|
this.expiration = expiration;
|
}
|
|
public String generateToken(User user) {
|
SecretKey key = Keys.hmacShaKeyFor(secret.getBytes());
|
|
return Jwts.builder()
|
.setSubject(user.getUser_name())
|
.claim("email", user.getUser_email())
|
.setIssuedAt(new Date())
|
.setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
|
.signWith(key, SignatureAlgorithm.HS256)
|
.compact();
|
}
|
|
public User parseToken(String token)
|
throws ExpiredJwtException, UnsupportedJwtException,
|
MalformedJwtException, SignatureException, IllegalArgumentException {
|
|
Claims claims = Jwts.parser()
|
.setSigningKey(getSigningKey())
|
.build()
|
.parseClaimsJws(token)
|
.getBody();
|
|
// 创建User对象并填充数据
|
User user = new User();
|
user.setUser_name(claims.getSubject()); // 主题是用户名
|
user.setUser_email(claims.get("email", String.class));
|
|
// 添加角色信息(如果存在)
|
// if (claims.containsKey("roles")) {
|
// user.setRoles(claims.get("roles", String.class));
|
// }
|
|
return user;
|
}
|
|
public boolean validateToken(String token) {
|
try {
|
parseToken(token);
|
return true;
|
} catch (Exception e) {
|
return false;
|
}
|
}
|
}
|