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.
		
		
		
		
			
				
					159 lines
				
				4.0 KiB
			
		
		
			
		
	
	
					159 lines
				
				4.0 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								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;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |