feat: temp token 模块增加前缀长度限制

This commit is contained in:
click33 2025-04-09 08:32:19 +08:00
parent 9ecaf72e9f
commit 713ac4d6e6
2 changed files with 44 additions and 5 deletions

View File

@ -17,6 +17,7 @@ package cn.dev33.satoken.temp;
import cn.dev33.satoken.SaManager; import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.session.raw.SaRawSessionDelegator; import cn.dev33.satoken.session.raw.SaRawSessionDelegator;
import cn.dev33.satoken.strategy.SaStrategy; import cn.dev33.satoken.strategy.SaStrategy;
@ -73,7 +74,7 @@ public class SaTempTemplate {
String tempToken = createTempTokenValue(value); String tempToken = createTempTokenValue(value);
// 持久化映射关系 // 持久化映射关系
_saveToken(tempToken, value, timeout); saveToken(tempToken, value, timeout);
// 记录索引 // 记录索引
if(isRecordIndex) { if(isRecordIndex) {
@ -86,6 +87,17 @@ public class SaTempTemplate {
return tempToken; return tempToken;
} }
/**
* 保存 token
* @param token /
* @param value /
* @param timeout /
*/
public void saveToken(String token, Object value, long timeout) {
String key = splicingTempTokenSaveKey(token);
SaManager.getSaTokenDao().setObject(key, value, timeout);
}
/** /**
* 创建一个 temp-token * 创建一个 temp-token
* *
@ -135,6 +147,11 @@ public class SaTempTemplate {
/** /**
* 解析 token 获取 value并裁剪指定前缀然后转换为指定类型 * 解析 token 获取 value并裁剪指定前缀然后转换为指定类型
* <h2>
* 请注意此方法在旧版本<= v1.41.0 时的三个参数为service, token, class <br/>
* 新版本三个参数为token, cutPrefix, class <br/>
* 请注意其中的逻辑变化
* </h2>
* *
* @param token 指定 Token * @param token 指定 Token
* @param cs 指定类型 * @param cs 指定类型
@ -151,6 +168,7 @@ public class SaTempTemplate {
} }
// 如果符合前缀则裁剪并返回如果不符合前缀则返回 null // 如果符合前缀则裁剪并返回如果不符合前缀则返回 null
checkCutPrefixLength(cutPrefix);
String str = SaFoxUtil.valueToString(value); String str = SaFoxUtil.valueToString(value);
if(str.startsWith(cutPrefix)) { if(str.startsWith(cutPrefix)) {
return SaFoxUtil.getValueByType(str.substring(cutPrefix.length()), cs); return SaFoxUtil.getValueByType(str.substring(cutPrefix.length()), cs);
@ -297,10 +315,6 @@ public class SaTempTemplate {
String key = splicingTempTokenSaveKey(token); String key = splicingTempTokenSaveKey(token);
return SaManager.getSaTokenDao().getObject(key); return SaManager.getSaTokenDao().getObject(key);
} }
protected void _saveToken(String token, Object value, long timeout) {
String key = splicingTempTokenSaveKey(token);
SaManager.getSaTokenDao().setObject(key, value, timeout);
}
protected void _deleteToken(String token) { protected void _deleteToken(String token) {
String key = splicingTempTokenSaveKey(token); String key = splicingTempTokenSaveKey(token);
SaManager.getSaTokenDao().deleteObject(key); SaManager.getSaTokenDao().deleteObject(key);
@ -314,6 +328,16 @@ public class SaTempTemplate {
// -------- 其它 // -------- 其它
/**
* 检查裁剪前缀长度
* @param cutPrefix /
*/
protected static void checkCutPrefixLength(String cutPrefix) {
if(cutPrefix.length() >= 32) {
throw new SaTokenException("裁剪前缀长度必须小于 32 位");
}
}
/** /**
* 过期时间转 ttl () 获取最大 ttl * 过期时间转 ttl () 获取最大 ttl
* @param tempTokenTtlList / * @param tempTokenTtlList /

View File

@ -58,6 +58,16 @@ public class SaTempUtil {
return SaManager.getSaTempTemplate().createToken(value, timeout, isRecordIndex); return SaManager.getSaTempTemplate().createToken(value, timeout, isRecordIndex);
} }
/**
* 保存 token
* @param token /
* @param value /
* @param timeout /
*/
public static void saveToken(String token, Object value, long timeout) {
SaManager.getSaTempTemplate().saveToken(token, value, timeout);
}
// -------- 解析 // -------- 解析
/** /**
@ -83,6 +93,11 @@ public class SaTempUtil {
/** /**
* 解析 token 获取 value并裁剪指定前缀然后转换为指定类型 * 解析 token 获取 value并裁剪指定前缀然后转换为指定类型
* <h2>
* 请注意此方法在旧版本<= v1.41.0 时的三个参数为service, token, class <br/>
* 新版本三个参数为token, cutPrefix, class <br/>
* 请注意其中的逻辑变化
* </h2>
* *
* @param token 指定 Token * @param token 指定 Token
* @param cs 指定类型 * @param cs 指定类型