JwtUtils.java
package com.mycim.webapp.secutiry.jwt;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.fa.sesa.threadlocal.LocalContextNames;
import com.mycim.framework.logging.Logger;
import com.mycim.framework.logging.LoggerFactory;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.webapp.secutiry.jwt.token.JwtToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import javax.annotation.PostConstruct;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
/**
* Jwt 工具类
*
* @author songp
*/
@Component
public class JwtUtils {
/**
* 过期时间 10min
*/
private static final String SECRET = "MYCIM2";
private static final String COOKIE_NAME = "TOKEN";
private static final String UNIQUE_ID = "VERSION";
private static final String PROCESS_RRN_KEY = "PROCESSRRN";
private static final String DATA_PERMISSION_KEY = "dataPermissionFlag";
private static final String SPECIAL_ROLE = "SPECIAL_ROLE";
private static final Logger LOGGER = LoggerFactory.getLogger(JwtUtils.class);
private static JwtProperties JWT_PROPERTIES;
@Autowired
private JwtProperties jwtProperties;
/**
* 注册Token
*/
public static String sign(JwtToken jwtToken) {
Date date = new Date(System.currentTimeMillis() + JWT_PROPERTIES.getExpirationTime());
Algorithm algorithm = Algorithm.HMAC256(SECRET);
return jwtToken.getBuilder().withClaim(UNIQUE_ID, JWT_PROPERTIES.getVersion()).withExpiresAt(date)
.sign(algorithm);
}
/**
* 验证Token
*/
public static boolean verify(JwtToken jwtToekn) {
try {
Algorithm algorithm = Algorithm.HMAC256(SECRET);
JWTVerifier verifier = jwtToekn.getVerification(JWT.require(algorithm))
.withClaim(UNIQUE_ID, JWT_PROPERTIES.getVersion()).build();
verifier.verify(jwtToekn.getToken());
return true;
} catch (Exception e) {
LOGGER.error("JwtToken Validation fails." + e.getMessage());
return false;
}
}
/**
* 设置Token到Cookie
*/
public static void setTokenToCookie(HttpServletResponse response, String token) {
Cookie cookie = new Cookie(JwtUtils.COOKIE_NAME, token);
cookie.setPath(JwtUtils.getContextPath());
response.addCookie(cookie);
}
public static Long getUserRrn(HttpServletRequest request) {
return (Long) getValueByKey(getToken(request), LocalContextNames.USER_RRN_KEY);
}
public static String getProcessRrns(HttpServletRequest request) {
return (String) getValueByKey(getToken(request), PROCESS_RRN_KEY);
}
public static String getDataPermissionFlag(HttpServletRequest request) {
return (String) getValueByKey(getToken(request), DATA_PERMISSION_KEY);
}
/**
* 获取Token中的值
*/
public static Object getValueByKey(String token, String key) {
if (StringUtils.isEmpty(token)) {
return null;
}
DecodedJWT jwt = JWT.decode(token);
// 判断类型 返回,目前JwtToken中只有Long和String
if (jwt.getClaim(key).asString() != null) {
return jwt.getClaim(key).asString();
} else if (jwt.getClaim(key).asLong() != null) {
return jwt.getClaim(key).asLong();
} else if (jwt.getClaim(key).asBoolean()!=null){
return jwt.getClaim(key).asBoolean();
}
return null;
}
/**
* 从request请求中的Cookie获取Token
*/
public static String getToken(HttpServletRequest request) {
return getCookieValue(request, JwtUtils.COOKIE_NAME);
}
private static String getCookieValue(HttpServletRequest request, String cookieName) {
Cookie[] cookies = request.getCookies();
if (cookies == null) {
return null;
}
for (Cookie cookie : cookies) {
if (cookie.getName().equals(cookieName)) {
if (StringUtils.isNotEmptyTrim(cookie.getValue())) {
return cookie.getValue();
}
}
}
return null;
}
public static Long getFacilityRrn(HttpServletRequest request) {
return (Long) getValueByKey(getToken(request), LocalContextNames.FACILITY_RRN_KEY);
}
public static String getLanguage(HttpServletRequest request) {
return (String) getValueByKey(getToken(request), LocalContextNames.LANGUAGE_KEY);
}
public static String getUserId(HttpServletRequest request) {
return (String) getValueByKey(getToken(request), LocalContextNames.USER_ID_KEY);
}
public static String getContextPath() {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = (HttpServletRequest) requestAttributes
.resolveReference(RequestAttributes.REFERENCE_REQUEST);
String contextPath = request.getContextPath();
return contextPath;
}
public static Boolean getSpecialRoleFlag(HttpServletRequest request) {
return (Boolean) getValueByKey(getToken(request), SPECIAL_ROLE);
}
@PostConstruct
public void init() {
if (JWT_PROPERTIES == null) {
JWT_PROPERTIES = jwtProperties;
}
}
}