You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					
					
						
							158 lines
						
					
					
						
							4.0 KiB
						
					
					
				
			
		
		
	
	
							158 lines
						
					
					
						
							4.0 KiB
						
					
					
				package com.ynxbd.common.helper.common;
 | 
						|
 | 
						|
import com.auth0.jwt.JWT;
 | 
						|
import com.auth0.jwt.JWTCreator;
 | 
						|
import com.auth0.jwt.JWTVerifier;
 | 
						|
import com.auth0.jwt.algorithms.Algorithm;
 | 
						|
import com.auth0.jwt.interfaces.DecodedJWT;
 | 
						|
import org.apache.commons.lang3.ObjectUtils;
 | 
						|
import org.apache.struts2.ServletActionContext;
 | 
						|
import org.slf4j.Logger;
 | 
						|
import org.slf4j.LoggerFactory;
 | 
						|
 | 
						|
import javax.servlet.ServletRequest;
 | 
						|
import java.util.Calendar;
 | 
						|
 | 
						|
/**
 | 
						|
 * jwt工具类
 | 
						|
 *
 | 
						|
 * @Author skotori
 | 
						|
 * @Date 2019-11-08 11:50
 | 
						|
 */
 | 
						|
public class JwtHelper {
 | 
						|
    private static final Logger log = LoggerFactory.getLogger(JwtHelper.class);
 | 
						|
 | 
						|
    // token头名
 | 
						|
    public static final String TOKEN_HEADER = "AuthToken";
 | 
						|
 | 
						|
    // 存储信息
 | 
						|
    public static final String USER_ID = "user_id";
 | 
						|
    public static final String USERNAME = "username";
 | 
						|
 | 
						|
    /**
 | 
						|
     * 生成token
 | 
						|
     *
 | 
						|
     * @param sign     密钥
 | 
						|
     * @param username 用户名
 | 
						|
     * @return token
 | 
						|
     */
 | 
						|
    public static String createToken(String sign, String username, Long userId) {
 | 
						|
        try {
 | 
						|
            JWTCreator.Builder builder = JWT.create();
 | 
						|
            builder.withClaim(USER_ID, userId);
 | 
						|
            builder.withClaim(USERNAME, username);
 | 
						|
            // 有效时间
 | 
						|
            Calendar instance = Calendar.getInstance();
 | 
						|
            instance.add(Calendar.HOUR, 6);
 | 
						|
            builder.withExpiresAt(instance.getTime());
 | 
						|
 | 
						|
            return builder.sign(Algorithm.HMAC256(sign));
 | 
						|
        } catch (Exception e) {
 | 
						|
            log.error("生成token异常:[ {} ]", e.getMessage());
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 校验token
 | 
						|
     *
 | 
						|
     * @param token token
 | 
						|
     * @param sign  签名
 | 
						|
     * @return 是否合法
 | 
						|
     */
 | 
						|
    public static boolean verifyToken(String token, String username, String sign) {
 | 
						|
        try {
 | 
						|
            Algorithm algorithm = Algorithm.HMAC256(sign);
 | 
						|
            JWTVerifier verifier = JWT.require(algorithm)
 | 
						|
                    .withClaim(USERNAME, username)
 | 
						|
                    .build();
 | 
						|
            verifier.verify(token);
 | 
						|
            return true;
 | 
						|
        } catch (Exception e) {
 | 
						|
            log.error("校验token异常:[ {} ]", e.getMessage());
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * 判断是否是超级管理员
 | 
						|
     *
 | 
						|
     * @return 是否为超管
 | 
						|
     */
 | 
						|
    public static boolean isSuperAdmin() {
 | 
						|
        return getUserId() == 0;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * 获取用户名
 | 
						|
     *
 | 
						|
     * @return username
 | 
						|
     */
 | 
						|
    public static String getUsername(String... token) {
 | 
						|
        if (token.length != 1) {
 | 
						|
            return getTokenVal(null, USERNAME, String.class);
 | 
						|
        } else {
 | 
						|
            return getTokenVal(token[0], USERNAME, String.class);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 获取userId
 | 
						|
     *
 | 
						|
     * @return userId
 | 
						|
     */
 | 
						|
    public static Long getUserId() {
 | 
						|
        return getTokenVal(USER_ID, Long.class);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 从token中获取account
 | 
						|
     *
 | 
						|
     * @param key 键
 | 
						|
     * @return value
 | 
						|
     */
 | 
						|
    public static <T> T getTokenVal(String key, Class<T> cls) {
 | 
						|
        return getTokenVal(null, key, cls);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 从token中获取account
 | 
						|
     *
 | 
						|
     * @param key 键
 | 
						|
     * @return value
 | 
						|
     */
 | 
						|
    public static <T> T getTokenVal(String token, String key, Class<T> cls) {
 | 
						|
        try {
 | 
						|
            if (ObjectUtils.isEmpty(token)) {
 | 
						|
                token = getReqToken(null);
 | 
						|
                if (token == null) {
 | 
						|
                    return null;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            DecodedJWT jwt = JWT.decode(token);
 | 
						|
            T val = jwt.getClaim(key).as(cls);
 | 
						|
            return ObjectUtils.isEmpty(val) ? null : val;
 | 
						|
        } catch (Exception e) {
 | 
						|
            log.error("从token中获取 {} 异常:[ {} ]", key, e.getMessage());
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * 获取请求Header中的token
 | 
						|
     *
 | 
						|
     * @param servletRequest 请求
 | 
						|
     * @return token
 | 
						|
     */
 | 
						|
    public static String getReqToken(ServletRequest servletRequest) {
 | 
						|
        String token = ServletActionContext.getRequest().getHeader(TOKEN_HEADER);
 | 
						|
        if (ObjectUtils.isEmpty(token)) {
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
        return token;
 | 
						|
    }
 | 
						|
}
 | 
						|
 |