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