Sa-Token
Sa-Token copied to clipboard
微服务 - 内部服务外网隔离问题
使用版本:
1.39.0
涉及的功能模块:
sa-token集成网关,[微服务 - 内部服务外网隔离]
-
我经过以下步骤测试: 网关增加
子服务增加
查看源码
这里currentToken的判断为空时调用refreshToken方法,但refreshToken方法内部sameToken不为空时才会写入xxx:var:past-same-token到redis,实际上currentToken和sameToken变量获取的值是同一个,这里是否矛盾了?如果currentToken为空,永远都不会写入xxx:var:past-same-token到redis,导致子服务在验证sameToken时,获取的past-same-token为空,子服务校验不通过
-
得出以下结果: 子服务在验证sameToken时,获取的past-same-token为空,子服务校验不通过
-
其中第 xx 行的代码输出表现 和文档上描述的不一致:
-
我的理解是:
请问,是我的理解不对,还是文档出了问题?
时间已久,代码具体逻辑我一时半会也理不过来,不过这一块没人反映过逻辑有问题,建议你可以执行一下,执行结果和预期不符的话再追问一下,我再看看
时间已久,代码具体逻辑我一时半会也理不过来,不过这一块没人反映过逻辑有问题,建议你可以执行一下,执行结果和预期不符的话再追问一下,我再看看
这个逻辑确实存在问题,会导致 pastToken 永远不会写入
第三行
public String getToken() {
String currentToken = getTokenNh();
if(SaFoxUtil.isEmpty(currentToken)) {
// 注意这里的自刷新不能做到高并发可用
currentToken = refreshToken();
}
return currentToken;
}
和第五行
public String refreshToken() {
// 1. 先将当前 Same-Token 写入到 Past-Same-Token 中
String sameToken = getTokenNh();
if( ! SaFoxUtil.isEmpty(sameToken)) {
savePastToken(sameToken, getTokenTimeout());
}
// 2. 再刷新当前 Same-Token
String newSameToken = createToken();
saveToken(newSameToken);
// 3. 返回新的 Same-Token
return newSameToken;
}
这两个判断导致永远不会有 pastToken 写入