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()) .claim("password", user.getPassword()) .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)); user.setPassword( claims.get("password", 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; } } }