JwtTokenUtil.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package com.loan.system.utils;
  2. import com.loan.system.constant.JwtClaimsConstant;
  3. import io.jsonwebtoken.Claims;
  4. import io.jsonwebtoken.ExpiredJwtException;
  5. import io.jsonwebtoken.Jwts;
  6. import io.jsonwebtoken.SignatureAlgorithm;
  7. import org.springframework.beans.factory.annotation.Value;
  8. import org.springframework.security.core.userdetails.UserDetails;
  9. import org.springframework.stereotype.Component;
  10. import java.io.Serializable;
  11. import java.util.Date;
  12. import java.util.HashMap;
  13. import java.util.List;
  14. /**
  15. * @author EdwinXu
  16. * @date 2020/9/2 - 20:46
  17. */
  18. @Component
  19. public class JwtTokenUtil implements Serializable {
  20. private static final long serialVersionUID = 8998885548318234112L;
  21. private static String secret;
  22. private static Long expiration;
  23. private static String header;
  24. private static String token_prefix;
  25. private static String issuer;
  26. @Value("${JWT.SECRET}")
  27. public void setSecret(String secret) {
  28. JwtTokenUtil.secret = secret;
  29. }
  30. @Value("${JWT.EXPIRATION}")
  31. public void setExpiration(Long expiration) {
  32. JwtTokenUtil.expiration = expiration;
  33. }
  34. @Value("${JWT.HEADER}")
  35. public void setHeader(String header) {
  36. JwtTokenUtil.header = header;
  37. }
  38. @Value("${JWT.TOKEN_PREFIX}")
  39. public void setTokenPrefix(String tokenPrefix) {
  40. JwtTokenUtil.token_prefix = tokenPrefix;
  41. }
  42. @Value("${JWT.ISSUER}")
  43. public void setIssuer(String issuer) {
  44. JwtTokenUtil.issuer = issuer;
  45. }
  46. /**
  47. * 生成 token
  48. * @param username 用户
  49. * @param roles 角色
  50. */
  51. public static String generateToken(String number, String username, List<String> roles){
  52. // token 签发时间
  53. final Date createdDate = new Date();
  54. // token 过期时间
  55. final Date expirationDate = new Date(createdDate.getTime() + expiration * 1000);
  56. final HashMap<String, Object> claims = new HashMap<>(2);
  57. claims.put("number",number);
  58. claims.put("username",username);
  59. claims.put("role",String.join(",",roles));
  60. return token_prefix+Jwts.builder()
  61. .setClaims(claims)
  62. // token 签发者
  63. .setIssuer(issuer)
  64. .signWith(SignatureAlgorithm.HS256 , secret)
  65. .setIssuedAt(createdDate)
  66. .setExpiration(expirationDate)
  67. // token 面向对象
  68. .setSubject(username)
  69. .compact();
  70. }
  71. public static Claims getClaimsFromToken(String token) {
  72. Claims claims;
  73. try {
  74. claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
  75. } catch (ExpiredJwtException e) {
  76. claims = e.getClaims();
  77. }
  78. return claims;
  79. }
  80. public static String getUsernameFromToken(String token) {
  81. return getClaimsFromToken(token).getSubject();
  82. }
  83. public static Long getUserIdFromToken(String token){
  84. return (Long) getClaimsFromToken(token).get(JwtClaimsConstant.USER_ID);
  85. }
  86. public static String getNumberFromToken(String token){
  87. return (String) getClaimsFromToken(token).get("number");
  88. }
  89. public static Boolean validateToken(String token, UserDetails userDetails) {
  90. final String username = getUsernameFromToken(token);
  91. return username.equals(userDetails.getUsername());
  92. }
  93. public static Boolean isTokenExpired(String token) {
  94. final Date expiration = getExpirationDateFromToken(token);
  95. return expiration.before(new Date());
  96. }
  97. public static Date getExpirationDateFromToken(String token) {
  98. return getClaimsFromToken(token).getExpiration();
  99. }
  100. }