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;
        }
    }

}