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