gateway和jwt網關認證實現過程解析

發布時間:2019-11-13 22:43 來源:互聯網 當前欄目:網站服務器

這篇文章主要介紹了gateway和jwt網關認證實現過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

思路: 全局過濾器對所有的請求攔截(生成token有效期30分鐘,放入redis設置有效期3天。3天之類可以通過刷新接口自動刷新,超過3天需要重新登錄。)

前端在調用接口之前先判斷token是否過期(3o分鐘),過期則先調刷新接口,換取新token,

1引入相關jar

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.9.0</version>
</dependency>

2編寫Jwt工具類(生成token + 解析token)

package spring.cloud.gateway.common;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import io.jsonwebtoken.ExpiredJwtException;
import org.springframework.util.StringUtils;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

public class JwtUtil {
  public static final String SECRET = "qazwsx123444$#%#()*&& asdaswwi1235 ?;[email protected]#kmmmpom in***xx**&";
  public static final String TOKEN_PREFIX = "Bearer";
  public static final String LOGIN_URL = "/token/userId/pwd";
  public static final String LOGOUT_URL = "/token/userId";
  public static final String HEADER_AUTH = "authorization";
  public static final String HEADER_USERID = "userid";
  //token超時時間
  public static final int TOKEN_EXPIRATION_MINUTE = 30;
  //token的redis超時時間
  public static final int TOKEN_REDIS_EXPIRATION_DAY = 7;

  
  public static String generateToken(String userId) {
    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.MINUTE, TOKEN_EXPIRATION_MINUTE); //得到前一天
    Date date = calendar.getTime();
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    df.format(date);
    //todo 優化token的生層規則
    HashMap<String, Object> map = new HashMap<>();
    map.put(HEADER_USERID, userId);
    String jwt = Jwts.builder()
        .setSubject(HEADER_USERID).setClaims(map)
        .setExpiration(date)
        .signWith(SignatureAlgorithm.HS512, SECRET)
        .compact();
    return TOKEN_PREFIX + " " + jwt;
  }

  public static Map<String, String> validateToken(String token) {
    HashMap<String, String> tokenMap = new HashMap<String, String>();
    if (StringUtils.isEmpty(token)) {
      return tokenMap;
    }
    try {
      Map<String, Object> tokenBody = Jwts.parser()
          .setSigningKey(SECRET)
          .parseClaimsJws(token.replace(TOKEN_PREFIX, ""))
          .getBody();
      String userId = String.valueOf(tokenBody.get(HEADER_USERID));
      tokenMap.put(HEADER_USERID, userId);
    }catch (ExpiredJwtException e){
      e.printStackTrace();
    }
    return tokenMap;
  }

  /**
   * 移到jwtUtil中去
   *
   * @param token
   * @return
   */
  public static Map<String, String> validateTokenAndUser(String token, String userIdIn) {
    Map<String, String> tokenResultMap = new HashMap<>();
    if (StringUtils.isEmpty(token) || StringUtils.isEmpty(userIdIn)) {
      return tokenResultMap;
    }
    tokenResultMap = validateToken(token);
    if (StringUtils.isEmpty(token) || StringUtils.isEmpty(userIdIn)) {
      return tokenResultMap;
    }
    //判斷傳入的userid和token是否匹配
    String userIdOri = tokenResultMap.get(HEADER_USERID);
    if (!userIdIn.equals(userIdOri)) {
      return new HashMap<String,String>();
    }
    return tokenResultMap;
  }

}
        
 
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、