package com.example.security; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.security.Key; import java.util.Date; import java.util.HashMap; import java.util.Map; @Component public class JwtTokenUtil { @Value("${jwt.secret:data-oracle-secret-key-for-jwt-token-generation}") private String secret; @Value("${jwt.expiration:86400000}") private Long expiration; private Key key; @PostConstruct public void init() { this.key = Keys.hmacShaKeyFor(secret.getBytes()); } public String generateToken(Long userId, String username, String deptCode) { Map claims = new HashMap<>(); claims.put("userId", userId); claims.put("username", username); claims.put("deptCode", deptCode); return createToken(claims, username); } private String createToken(Map claims, String subject) { return Jwts.builder() .setClaims(claims) .setSubject(subject) .setIssuedAt(new Date(System.currentTimeMillis())) .setExpiration(new Date(System.currentTimeMillis() + expiration)) .signWith(key, SignatureAlgorithm.HS256) .compact(); } public String getUsernameFromToken(String token) { return getClaimsFromToken(token).getSubject(); } public Long getUserIdFromToken(String token) { Claims claims = getClaimsFromToken(token); return claims.get("userId", Long.class); } public String getDeptCodeFromToken(String token) { Claims claims = getClaimsFromToken(token); return claims.get("deptCode", String.class); } private Claims getClaimsFromToken(String token) { return Jwts.parserBuilder() .setSigningKey(key) .build() .parseClaimsJws(token) .getBody(); } public boolean validateToken(String token) { try { getClaimsFromToken(token); return !isTokenExpired(token); } catch (Exception e) { return false; } } private boolean isTokenExpired(String token) { Date expiration = getClaimsFromToken(token).getExpiration(); return expiration.before(new Date()); } }