feat: 重构 temp token 模块,新增 value 反查 token 机制
This commit is contained in:
@@ -22,10 +22,10 @@
|
||||
<groupId>cn.dev33</groupId>
|
||||
<artifactId>sa-token-core</artifactId>
|
||||
</dependency>
|
||||
<!-- jwt -->
|
||||
<!-- jwt -->
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt</artifactId>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt</artifactId>
|
||||
</dependency>
|
||||
<!-- 不加这个报 java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter -->
|
||||
<dependency>
|
||||
|
||||
+2
-2
@@ -16,7 +16,7 @@
|
||||
package cn.dev33.satoken.plugin;
|
||||
|
||||
import cn.dev33.satoken.SaManager;
|
||||
import cn.dev33.satoken.temp.jwt.SaTempForJwt;
|
||||
import cn.dev33.satoken.temp.jwt.SaTempTemplateForJwt;
|
||||
|
||||
/**
|
||||
* SaToken 插件安装:临时 token 生成器 - Jwt 版
|
||||
@@ -28,7 +28,7 @@ public class SaTokenPluginForTempForJwt implements SaTokenPlugin {
|
||||
|
||||
@Override
|
||||
public void install() {
|
||||
SaManager.setSaTemp(new SaTempForJwt());
|
||||
SaManager.setSaTempTemplate(new SaTempTemplateForJwt());
|
||||
}
|
||||
|
||||
}
|
||||
+21
-23
@@ -17,11 +17,14 @@ package cn.dev33.satoken.temp.jwt;
|
||||
|
||||
import cn.dev33.satoken.dao.SaTokenDao;
|
||||
import cn.dev33.satoken.exception.SaTokenException;
|
||||
import cn.dev33.satoken.secure.SaSecureUtil;
|
||||
import cn.dev33.satoken.temp.jwt.error.SaTempJwtErrorCode;
|
||||
import io.jsonwebtoken.Claims;
|
||||
import io.jsonwebtoken.JwtBuilder;
|
||||
import io.jsonwebtoken.Jwts;
|
||||
import io.jsonwebtoken.SignatureAlgorithm;
|
||||
import io.jsonwebtoken.security.Keys;
|
||||
|
||||
import javax.crypto.SecretKey;
|
||||
|
||||
/**
|
||||
* jwt 相关操作工具类,封装一下
|
||||
@@ -47,13 +50,12 @@ public class SaJwtUtil {
|
||||
/**
|
||||
* 根据指定值创建 jwt-token
|
||||
*
|
||||
* @param key 存储value使用的key
|
||||
* @param value 要保存的值
|
||||
* @param timeout token有效期 (单位 秒)
|
||||
* @param keyt 秘钥
|
||||
* @return jwt-token
|
||||
*/
|
||||
public static String createToken(String key, Object value, long timeout, String keyt) {
|
||||
public static String createToken(Object value, long timeout, String keyt) {
|
||||
// 计算eff有效期:
|
||||
// 如果 timeout 指定为 -1,那么 eff 也为 -1,代表永不过期
|
||||
// 如果 timeout 指定为一个具体的值,那么 eff 为 13 位时间戳,代表此数据到期的时间
|
||||
@@ -62,12 +64,13 @@ public class SaJwtUtil {
|
||||
eff = timeout * 1000 + System.currentTimeMillis();
|
||||
}
|
||||
|
||||
// 在这里你可以使用官方提供的claim方法构建载荷,也可以使用setPayload自定义载荷,但是两者不可一起使用
|
||||
JwtBuilder builder = Jwts.builder()
|
||||
// .setHeaderParam("typ", "JWT")
|
||||
.claim(KEY_VALUE + key, value)
|
||||
// 在这里你可以使用官方提供的claim方法构建载荷,也可以使用setPayload自定义载荷,但是两者不可一起使用
|
||||
SecretKey key = Keys.hmacShaKeyFor(SaSecureUtil.md5(keyt).getBytes());
|
||||
JwtBuilder builder = Jwts.builder()
|
||||
.header().add("typ", "JWT").and()
|
||||
.claim(KEY_VALUE, value)
|
||||
.claim(KEY_EFF, eff)
|
||||
.signWith(SignatureAlgorithm.HS256, keyt.getBytes());
|
||||
.signWith(key);
|
||||
|
||||
// 生成jwt-token
|
||||
return builder.compact();
|
||||
@@ -81,19 +84,20 @@ public class SaJwtUtil {
|
||||
*/
|
||||
public static Claims parseToken(String jwtToken, String keyt) {
|
||||
// 解析出载荷
|
||||
SecretKey key = Keys.hmacShaKeyFor(SaSecureUtil.md5(keyt).getBytes());
|
||||
return Jwts.parser()
|
||||
.setSigningKey(keyt.getBytes())
|
||||
.parseClaimsJws(jwtToken).getBody();
|
||||
.verifyWith(key)
|
||||
.build()
|
||||
.parseSignedClaims(jwtToken).getPayload();
|
||||
}
|
||||
|
||||
/**
|
||||
* 从一个 jwt-token 解析出载荷, 并取出数据
|
||||
* @param key 存储value使用的key
|
||||
* 从一个 jwt-token 解析出载荷, 并取出数据
|
||||
* @param jwtToken JwtToken值
|
||||
* @param keyt 秘钥
|
||||
* @return 值
|
||||
*/
|
||||
public static Object getValue(String key, String jwtToken, String keyt) {
|
||||
public static Object getValue(String jwtToken, String keyt) {
|
||||
// 取出数据
|
||||
Claims claims = parseToken(jwtToken, keyt);
|
||||
|
||||
@@ -104,25 +108,19 @@ public class SaJwtUtil {
|
||||
}
|
||||
|
||||
// 获取数据
|
||||
return claims.get(KEY_VALUE + key);
|
||||
return claims.get(KEY_VALUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 从一个 jwt-token 解析出载荷, 并取出其剩余有效期
|
||||
* @param service 指定的服务类型
|
||||
* @param jwtToken JwtToken值
|
||||
* @param keyt 秘钥
|
||||
* @return 值
|
||||
*/
|
||||
public static long getTimeout(String service, String jwtToken, String keyt) {
|
||||
public static long getTimeout(String jwtToken, String keyt) {
|
||||
// 取出数据
|
||||
Claims claims = parseToken(jwtToken, keyt);
|
||||
|
||||
// 如果给定的 service 不对
|
||||
if(claims.get(KEY_VALUE + service) == null) {
|
||||
return SaTokenDao.NOT_VALUE_EXPIRE;
|
||||
}
|
||||
|
||||
|
||||
// 验证是否超时
|
||||
Long eff = claims.get(KEY_EFF, Long.class);
|
||||
|
||||
@@ -131,7 +129,7 @@ public class SaJwtUtil {
|
||||
return NEVER_EXPIRE;
|
||||
}
|
||||
// 已经超时
|
||||
if(eff == null || eff < System.currentTimeMillis()) {
|
||||
if(eff < System.currentTimeMillis()) {
|
||||
return SaTokenDao.NOT_VALUE_EXPIRE;
|
||||
}
|
||||
|
||||
|
||||
+21
-10
@@ -18,50 +18,61 @@ package cn.dev33.satoken.temp.jwt;
|
||||
import cn.dev33.satoken.SaManager;
|
||||
import cn.dev33.satoken.exception.ApiDisabledException;
|
||||
import cn.dev33.satoken.exception.SaTokenException;
|
||||
import cn.dev33.satoken.temp.SaTempInterface;
|
||||
import cn.dev33.satoken.temp.SaTempTemplate;
|
||||
import cn.dev33.satoken.temp.jwt.error.SaTempJwtErrorCode;
|
||||
import cn.dev33.satoken.util.SaFoxUtil;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Sa-Token 临时令牌验证模块接口 JWT实现类,提供以 JWT 为逻辑内核的临时 token 验证功能
|
||||
*
|
||||
* @author click33
|
||||
* @since 1.20.0
|
||||
*/
|
||||
public class SaTempForJwt implements SaTempInterface {
|
||||
public class SaTempTemplateForJwt extends SaTempTemplate {
|
||||
|
||||
/**
|
||||
* 根据value创建一个token
|
||||
*/
|
||||
@Override
|
||||
public String createToken(String service, Object value, long timeout) {
|
||||
return SaJwtUtil.createToken(service, value, timeout, getJwtSecretKey());
|
||||
public String createToken(Object value, long timeout, boolean isRecordIndex) {
|
||||
return SaJwtUtil.createToken(value, timeout, getJwtSecretKey());
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析token获取value
|
||||
*/
|
||||
@Override
|
||||
public Object parseToken(String service, String token) {
|
||||
return SaJwtUtil.getValue(service, token, getJwtSecretKey());
|
||||
public Object parseToken(String token) {
|
||||
return SaJwtUtil.getValue(token, getJwtSecretKey());
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回指定token的剩余有效期,单位:秒
|
||||
*/
|
||||
@Override
|
||||
public long getTimeout(String service, String token) {
|
||||
return SaJwtUtil.getTimeout(service, token, getJwtSecretKey());
|
||||
public long getTimeout(String token) {
|
||||
return SaJwtUtil.getTimeout(token, getJwtSecretKey());
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除一个token
|
||||
*/
|
||||
@Override
|
||||
public void deleteToken(String service, String token) {
|
||||
public void deleteToken(String token) {
|
||||
throw new ApiDisabledException("jwt cannot delete token").setCode(SaTempJwtErrorCode.CODE_30302);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取指定 value 的 temp-token 列表记录
|
||||
* @param value /
|
||||
* @return /
|
||||
*/
|
||||
public List<String> getTempTokenList(Object value) {
|
||||
throw new ApiDisabledException("jwt cannot get token list").setCode(SaTempJwtErrorCode.CODE_30304);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取jwt秘钥
|
||||
* @return jwt秘钥
|
||||
+3
@@ -32,4 +32,7 @@ public interface SaTempJwtErrorCode {
|
||||
/** Token已超时 */
|
||||
int CODE_30303 = 30303;
|
||||
|
||||
/** jwt 模式不可以查询旧 Token 列表 */
|
||||
int CODE_30304 = 30304;
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user