¶Ô±ÈÐÂÎļþ |
| | |
| | | /* |
| | | * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. |
| | | * |
| | | * Redistribution and use in source and binary forms, with or without |
| | | * modification, are permitted provided that the following conditions are met: |
| | | * |
| | | * Redistributions of source code must retain the above copyright notice, |
| | | * this list of conditions and the following disclaimer. |
| | | * Redistributions in binary form must reproduce the above copyright |
| | | * notice, this list of conditions and the following disclaimer in the |
| | | * documentation and/or other materials provided with the distribution. |
| | | * Neither the name of the dreamlu.net developer nor the names of its |
| | | * contributors may be used to endorse or promote products derived from |
| | | * this software without specific prior written permission. |
| | | * Author: Chill åºéª (smallchill@163.com) |
| | | */ |
| | | package org.springblade.core.jwt; |
| | | |
| | | import io.jsonwebtoken.Claims; |
| | | import io.jsonwebtoken.Jwts; |
| | | import org.springblade.core.jwt.props.JwtProperties; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.util.StringUtils; |
| | | |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.util.Base64; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | /** |
| | | * Jwtå·¥å
·ç±» |
| | | * |
| | | * @author Chill |
| | | */ |
| | | public class JwtUtil { |
| | | |
| | | /** |
| | | * tokenåºç¡é
ç½® |
| | | */ |
| | | public static String BEARER = "bearer"; |
| | | public static Integer AUTH_LENGTH = 7; |
| | | |
| | | /** |
| | | * tokenä¿åè³redisçkey |
| | | */ |
| | | private static final String REFRESH_TOKEN_CACHE = "blade:refreshToken"; |
| | | private static final String TOKEN_CACHE = "blade:token"; |
| | | private static final String TOKEN_KEY = "token:state:"; |
| | | |
| | | /** |
| | | * jwté
ç½® |
| | | */ |
| | | private static JwtProperties jwtProperties; |
| | | |
| | | /** |
| | | * rediså·¥å
· |
| | | */ |
| | | private static RedisTemplate<String, Object> redisTemplate; |
| | | |
| | | public static JwtProperties getJwtProperties() { |
| | | return jwtProperties; |
| | | } |
| | | |
| | | public static void setJwtProperties(JwtProperties properties) { |
| | | if (JwtUtil.jwtProperties == null) { |
| | | JwtUtil.jwtProperties = properties; |
| | | } |
| | | } |
| | | |
| | | public static RedisTemplate<String, Object> getRedisTemplate() { |
| | | return redisTemplate; |
| | | } |
| | | |
| | | public static void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { |
| | | if (JwtUtil.redisTemplate == null) { |
| | | JwtUtil.redisTemplate = redisTemplate; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * ç¾åå å¯ |
| | | */ |
| | | public static String getBase64Security() { |
| | | return Base64.getEncoder().encodeToString(getJwtProperties().getSignKey().getBytes(StandardCharsets.UTF_8)); |
| | | } |
| | | |
| | | /** |
| | | * è·å请æ±ä¼ éçtoken串 |
| | | * |
| | | * @param auth token |
| | | * @return String |
| | | */ |
| | | public static String getToken(String auth) { |
| | | if ((auth != null) && (auth.length() > AUTH_LENGTH)) { |
| | | String headStr = auth.substring(0, 6).toLowerCase(); |
| | | if (headStr.compareTo(BEARER) == 0) { |
| | | auth = auth.substring(7); |
| | | } |
| | | return auth; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * è§£æjsonWebToken |
| | | * |
| | | * @param jsonWebToken token串 |
| | | * @return Claims |
| | | */ |
| | | public static Claims parseJWT(String jsonWebToken) { |
| | | try { |
| | | return Jwts.parserBuilder() |
| | | .setSigningKey(Base64.getDecoder().decode(getBase64Security())).build() |
| | | .parseClaimsJws(jsonWebToken).getBody(); |
| | | } catch (Exception ex) { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è·åä¿åå¨redisçaccessToken |
| | | * |
| | | * @param tenantId ç§æ·id |
| | | * @param userId ç¨æ·id |
| | | * @param accessToken accessToken |
| | | * @return accessToken |
| | | */ |
| | | public static String getAccessToken(String tenantId, String userId, String accessToken) { |
| | | return String.valueOf(getRedisTemplate().opsForValue().get(getAccessTokenKey(tenantId, userId, accessToken))); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * æ·»å accessTokenè³redis |
| | | * |
| | | * @param tenantId ç§æ·id |
| | | * @param userId ç¨æ·id |
| | | * @param accessToken accessToken |
| | | * @param expire è¿ææ¶é´ |
| | | */ |
| | | public static void addAccessToken(String tenantId, String userId, String accessToken, int expire) { |
| | | getRedisTemplate().delete(getAccessTokenKey(tenantId, userId, accessToken)); |
| | | getRedisTemplate().opsForValue().set(getAccessTokenKey(tenantId, userId, accessToken), accessToken, expire, TimeUnit.SECONDS); |
| | | } |
| | | |
| | | /** |
| | | * å é¤ä¿åå¨redisçaccessToken |
| | | * |
| | | * @param tenantId ç§æ·id |
| | | * @param userId ç¨æ·id |
| | | */ |
| | | public static void removeAccessToken(String tenantId, String userId) { |
| | | removeAccessToken(tenantId, userId, null); |
| | | } |
| | | |
| | | /** |
| | | * å é¤ä¿åå¨redisçaccessToken |
| | | * |
| | | * @param tenantId ç§æ·id |
| | | * @param userId ç¨æ·id |
| | | * @param accessToken accessToken |
| | | */ |
| | | public static void removeAccessToken(String tenantId, String userId, String accessToken) { |
| | | getRedisTemplate().delete(getAccessTokenKey(tenantId, userId, accessToken)); |
| | | } |
| | | |
| | | /** |
| | | * è·åaccessTokenç´¢å¼ |
| | | * |
| | | * @param tenantId ç§æ·id |
| | | * @param userId ç¨æ·id |
| | | * @param accessToken accessToken |
| | | * @return tokenç´¢å¼ |
| | | */ |
| | | public static String getAccessTokenKey(String tenantId, String userId, String accessToken) { |
| | | String key = tenantId.concat(":").concat(TOKEN_CACHE).concat("::").concat(TOKEN_KEY); |
| | | if (getJwtProperties().getSingle() || StringUtils.isEmpty(accessToken)) { |
| | | return key.concat(userId); |
| | | } else { |
| | | return key.concat(accessToken); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è·åä¿åå¨redisçrefreshToken |
| | | * |
| | | * @param tenantId ç§æ·id |
| | | * @param userId ç¨æ·id |
| | | * @param refreshToken refreshToken |
| | | * @return accessToken |
| | | */ |
| | | public static String getRefreshToken(String tenantId, String userId, String refreshToken) { |
| | | return String.valueOf(getRedisTemplate().opsForValue().get(getRefreshTokenKey(tenantId, userId))); |
| | | } |
| | | |
| | | /** |
| | | * æ·»å refreshTokenè³redis |
| | | * |
| | | * @param tenantId ç§æ·id |
| | | * @param userId ç¨æ·id |
| | | * @param refreshToken refreshToken |
| | | * @param expire è¿ææ¶é´ |
| | | */ |
| | | public static void addRefreshToken(String tenantId, String userId, String refreshToken, int expire) { |
| | | getRedisTemplate().delete(getRefreshTokenKey(tenantId, userId)); |
| | | getRedisTemplate().opsForValue().set(getRefreshTokenKey(tenantId, userId), refreshToken, expire, TimeUnit.SECONDS); |
| | | } |
| | | |
| | | /** |
| | | * å é¤ä¿åå¨refreshTokençtoken |
| | | * |
| | | * @param tenantId ç§æ·id |
| | | * @param userId ç¨æ·id |
| | | */ |
| | | public static void removeRefreshToken(String tenantId, String userId) { |
| | | getRedisTemplate().delete(getRefreshTokenKey(tenantId, userId)); |
| | | } |
| | | |
| | | /** |
| | | * è·årefreshTokenç´¢å¼ |
| | | * |
| | | * @param tenantId ç§æ·id |
| | | * @param userId ç¨æ·id |
| | | * @return tokenç´¢å¼ |
| | | */ |
| | | public static String getRefreshTokenKey(String tenantId, String userId) { |
| | | return tenantId.concat(":").concat(REFRESH_TOKEN_CACHE).concat("::").concat(TOKEN_KEY).concat(userId); |
| | | } |
| | | |
| | | } |