jjwt无状态鉴权

jjwt官方文档:https://github.com/jwtk/jjwt

关于jjwt的使用官方文档写的很详细

在做shiro无状态鉴权时写了一个工具类

package com.lv.myframework.utils;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@Slf4j
public class JwtUtil {
    //设置加密密钥
    private static SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);

    /**
     * 生成token
     * @param id 指定token id
     * @return
     */
    public static String encode(String id){
        return JwtUtil.encode(null,false,id);
    }

    /**
     * 生成token
     * @param id 指定token id
     * @param rememberMe 是否记住我
     * @return
     */
    public static String encode(String id,Boolean rememberMe){
        return JwtUtil.encode(null,true,id);
    }

    /**
     * 生成的token未记住的情况下默认有效时间为10min,记住我有效期为3day
     * @param claims 额外添加到荷部分的信息。
     * @param rememberMe 是否记住我
     * @return
     */
    public static String encode(Map claims,Boolean rememberMe,String id){
        if (claims == null) {
            claims = new HashMap<>();
        }
        // 签发时间(iat):荷载部分的标准字段之一
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        Date expireDate = null;
        if(!rememberMe){
            expireDate = new Date(nowMillis + 10*60*1000);
        }else{
            expireDate = new Date(nowMillis + 3*24*60*60*1000);
        }
        //TODO 将token信息存入redis
        return Jwts.builder().setClaims(claims)
                .setIssuedAt(now)
                .setId(id)
                .setExpiration(expireDate)
                .signWith(secretKey).compact();
    }

    /**
     * 根据token获取Claims
     * @param token
     * @return
     */
    public static Claims decode(String token){
       return Jwts.parserBuilder().setSigningKey(secretKey).build().parseClaimsJws(token).getBody();
    }

    /**
     * 验证token是否有效
     * @param token
     * @return
     */
    public static Boolean verify(String token){
        try {
            Jwts.parserBuilder().setSigningKey(secretKey).build().parseClaimsJws(token);
            return true;
        }catch (ExpiredJwtException e){
            log.error(e.getMessage());
            return false;
        } catch (JwtException e) {
            log.error(e.getMessage());
            return false;
        } catch (Exception e){
            log.error(e.getMessage());
            return false;
        }
    }

}

你可能感兴趣的:(jjwt无状态鉴权)