liulin
2024-07-30 ce04dfcdd664df7e791a63800cab2cd2d12e878c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.lunhan.xxx.common.jwt;
 
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.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.lunhan.xxx.common.ConstantFactory;
import com.lunhan.xxx.common.config.SysConfig;
import com.lunhan.xxx.common.enums.EResultCode;
import com.lunhan.xxx.common.exceptions.BusinessException;
import com.lunhan.xxx.common.util.LocalDateTimeUtil;
import com.lunhan.xxx.common.util.NumericUtil;
import com.lunhan.xxx.common.util.StringUtil;
 
import java.time.LocalDateTime;
import java.util.Date;
 
public class JWTUtil {
    /**
     * @return token中包含的用户名
     */
    public static LoginUserDTO getUser(String token) {
        if (StringUtil.isNullOrEmpty(token)) {
            throw new BusinessException(EResultCode.UNAUTHORIZED, "尚未登录");
        }
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SysConfig.jwt.getSecret()))
                .build();
        DecodedJWT jwt = null;
        try {
 
            jwt = verifier.verify(token);
        } catch (TokenExpiredException e) {
            throw new BusinessException(EResultCode.UNAUTHORIZED, "token已过期");
        } catch (Exception e) {
            throw new BusinessException(EResultCode.UNAUTHORIZED, "token格式不正确." + token);
        }
        if (null == jwt) {
            throw new BusinessException(EResultCode.UNAUTHORIZED, "token已过期");
        }
        Date expiresAt = jwt.getExpiresAt();
 
        LocalDateTime dtExpires = LocalDateTimeUtil.getDateTime(expiresAt.getTime());
        if (dtExpires.isBefore(LocalDateTimeUtil.nowDateTime())) {
            throw new BusinessException(EResultCode.UNAUTHORIZED, "token已过期");
        }
        LoginUserDTO loginUser = new LoginUserDTO();
        loginUser.setUserId(jwt.getClaim("userId").asString());
        loginUser.setUserType(NumericUtil.tryParseInt(jwt.getClaim("userType").asString(), 0));
        loginUser.setPhone(jwt.getClaim("phone").asString());
        loginUser.setPhone(jwt.getClaim("phone").asString());
        loginUser.setNickName(jwt.getClaim("nickName").asString());
        loginUser.setHeadImg(jwt.getClaim("headImg").asString());
        loginUser.setListRole(StringUtil.splitLongList(jwt.getClaim("listRole").asString()));
        loginUser.setListRoleName(StringUtil.splitList(jwt.getClaim("listRoleName").asString()));
        loginUser.setCustomerCompany(NumericUtil.tryParseLong(jwt.getClaim("customerCompany").asString(), 0L));
        loginUser.setCustomerCompanyName(jwt.getClaim("customerCompanyName").asString());
        loginUser.setCustomerRegion(jwt.getClaim("customerRegion").asString());
        loginUser.setIsChild(NumericUtil.tryParseInt(jwt.getClaim("isChild").asString(), 0));
 
        return loginUser;
    }
 
    /**
     * 生成token,并保存到jwt
     *
     * @param loginUser 登录用户信息
     * @return 加密的token
     */
    public static String getToken(LoginUserDTO loginUser) {
        JWTCreator.Builder builder = JWT.create()
                //设置jwt生成时间
                .withIssuedAt(new Date(LocalDateTimeUtil.nowTimeStamp()))
                //设置token有效期
                .withExpiresAt(new Date(LocalDateTimeUtil.nowTimeStamp() + SysConfig.jwt.getExpiration() * ConstantFactory.TIME_LEN_1S));
        builder.withClaim("userId", loginUser.getUserId());
        builder.withClaim("userType", loginUser.getUserType().toString());
        builder.withClaim("phone", loginUser.getPhone());
        builder.withClaim("nickName", loginUser.getNickName());
        builder.withClaim("headImg", loginUser.getHeadImg());
        builder.withClaim("listRole", loginUser.getListRole().toString());
        builder.withClaim("listRoleName", loginUser.getListRoleName().toString());
        builder.withClaim("customerCompany", loginUser.getCustomerCompany().toString());
        builder.withClaim("customerCompanyName", loginUser.getCustomerCompanyName());
        builder.withClaim("customerRegion", loginUser.getCustomerRegion());
        builder.withClaim("isChild", loginUser.getIsChild().toString());
        return builder
                //生成token字符串
                .sign(Algorithm.HMAC256(SysConfig.jwt.getSecret()))
                ;
    }
}