Sunshine
2024-11-05 8f7985d7764a0aad24bd593ac5ea47b7fc290961
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package com.nova.sankuai.security;
 
import com.nova.sankuai.infra.utils.UserUtil;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import io.swagger.annotations.ApiModel;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.InsufficientAuthenticationException;
import org.springframework.stereotype.Component;
 
import javax.annotation.PostConstruct;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
 
/**
 * @author weikangdi
 */
@Component
@ApiModel("JWT工具类")
public class JwtUtils {
 
    private static final String CLAIM_KEY_ID = "id";
 
    private static final String CLAIM_KEY_USERNAME = "username";
 
    private static final String CLAIM_KEY_PHONE = "phone";
 
    private static final String CLAIM_KEY_CREATED = "createTime";
 
    private static final String CLAIM_KEY_TYPE = "type";
 
    @Value("${jwt.secret.key}")
    private String secretKey;
 
    @Value("${jwt.token.expired}")
    private Long expired;
 
    private Key key;
 
    @PostConstruct
    public void init() {
        key = Keys.hmacShaKeyFor(secretKey.getBytes());
    }
 
    public String generateToken(UserDetail userDetail) {
        Map<String, Object> claims = new HashMap<>(5);
        claims.put(CLAIM_KEY_USERNAME, userDetail.getUsername());
        claims.put(CLAIM_KEY_CREATED, new Date());
        claims.put(CLAIM_KEY_TYPE, userDetail.getType());
        claims.put(CLAIM_KEY_PHONE, userDetail.getPhone());
        return generateToken(claims);
    }
 
    private String generateToken(Map<String, Object> claims) {
        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(new Date(System.currentTimeMillis() + expired))
                .signWith(key)
                .compact();
    }
 
 
    /**
     * 获取过期时间戳
     *
     * @param token
     * @return
     */
    public long getExpirationTime(String token) {
        final Claims claims = getClaimsFromToken(token);
        if (claims == null) {
            return 0;
        }
        return claims.getExpiration().getTime();
    }
 
    /**
     * 从token中获取username,如果过期则抛出异常
     *
     * @param token token
     * @return username
     */
    public String getUsernameFromToken(String token) {
        try {
            final Claims claims = getClaimsFromToken(token);
            if (claims == null) {
                return null;
            }
            Date expiration = claims.getExpiration();
            if (new Date().after(expiration)) {
                throw new InsufficientAuthenticationException("session timeout");
            }
            return (String) claims.get(CLAIM_KEY_USERNAME);
        } catch (Exception e) {
            return null;
        }
    }
 
 
    /**
     * 从token中获取用户信息,如果过期则抛出异常
     *
     * @param token token
     * @return UserDetail
     */
    public UserDetail getUserDetailFromToken(String token) {
        try {
            final Claims claims = getClaimsFromToken(token);
            if (claims == null) {
                return null;
            }
            Date expiration = claims.getExpiration();
            if (new Date().after(expiration)) {
                throw new InsufficientAuthenticationException("session timeout");
            }
            UserDetail userDetail = UserUtil.getUser(token);
            if (userDetail == null) {
                throw new InsufficientAuthenticationException("session timeout");
            }
            return userDetail;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
 
    private Claims getClaimsFromToken(String token) {
        Claims claims;
        try {
            claims = Jwts.parser()
                    .setSigningKey(key)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            return null;
        }
        return claims;
    }
 
}