package com.lxzn.auth; import com.alibaba.fastjson.JSON; import com.lxzn.framework.utils.ValidateUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.security.jwt.Jwt; import org.springframework.security.jwt.JwtHelper; import org.springframework.security.jwt.crypto.sign.RsaVerifier; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Map; import java.util.stream.Collectors; @Slf4j public class JwtUtil { //公钥 private static final String PUBLIC_KEY = "publickey.txt"; /** * 获取非对称加密公钥 Key * @return 公钥 Key */ public static String getPubKey() { Resource resource = new ClassPathResource(PUBLIC_KEY); BufferedReader br = null; try { InputStreamReader inputStreamReader = new InputStreamReader(resource.getInputStream()); br = new BufferedReader(inputStreamReader); return br.lines().collect(Collectors.joining("\n")); } catch (IOException ioe) { log.error(ioe.getMessage(), ioe.getStackTrace()); return null; }finally { if(br != null) { try { br.close(); } catch (IOException e) { log.error(e.getMessage(), e.getStackTrace()); return null; } } } } public static Map parseJwtToken(String jwtToken) { String pubKey = getPubKey(); Jwt jwt = JwtHelper.decodeAndVerify(jwtToken, new RsaVerifier(pubKey)); if(jwt == null) return null; String claims = jwt.getClaims(); if(!ValidateUtil.validateString(claims)) return null; Map map = JSON.parseObject(claims, Map.class); return map; } public static String getUserId() { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); if(requestAttributes == null) return null; HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest(); if(request == null) return null; String header = request.getHeader("Authorization"); if(ValidateUtil.validateString(header) && header.toLowerCase().startsWith("bearer ")) { String token = header.substring("bearer ".length()); Map map = parseJwtToken(token); if(map != null && map.containsKey("userId")){ return map.get("userId"); } } return null; } }