在登录时增加判断当前 StpLogic 是否支持 extra 扩展参数模式

This commit is contained in:
click33
2023-05-17 20:04:59 +08:00
parent 5bae8504da
commit 73e84decde
7 changed files with 94 additions and 32 deletions
@@ -394,10 +394,8 @@ public class StpLogic {
*/ */
public String createLoginSession(Object id, SaLoginModel loginModel) { public String createLoginSession(Object id, SaLoginModel loginModel) {
// 1、先检查一下,传入的账号id是否可用 // 1、先检查一下,传入的参数是否有效
if(SaFoxUtil.isEmpty(id)) { checkLoginArgs(id, loginModel);
throw new SaTokenException("账号 id 不能为空").setCode(SaErrorCode.CODE_11002);
}
// 2、初始化 loginModel ,给一些参数补上默认值 // 2、初始化 loginModel ,给一些参数补上默认值
SaTokenConfig config = getConfig(); SaTokenConfig config = getConfig();
@@ -483,7 +481,36 @@ public class StpLogic {
} }
); );
} }
/**
* 校验登录时的参数有效性,如果有问题会打印警告或抛出异常
*
* @param id 账号id
* @param loginModel 此次登录的参数Model
*/
protected void checkLoginArgs(Object id, SaLoginModel loginModel) {
// 1、先检查一下,传入的账号id是否可用
if(SaFoxUtil.isEmpty(id)) {
throw new SaTokenException("loginId 不能为空").setCode(SaErrorCode.CODE_11002);
}
// 2、判断账号id是否为简单类型
if( ! SaFoxUtil.isBasicType(id.getClass())) {
SaManager.log.warn("loginId 应该为简单类型,例如:String | int | long,不推荐使用复杂类型:" + id.getClass());
}
// 3、判断当前 StpLogic 是否支持 extra 扩展参数
if( ! isSupportExtra()) {
// 如果不支持,开发者却传入了 extra 扩展参数,那么就打印警告信息
Map<String, Object> extraData = loginModel.getExtraData();
if(extraData != null && extraData.size() > 0) {
SaManager.log.warn("当前 StpLogic 不支持 extra 扩展参数模式,传入的 extra 数据将被忽略");
}
}
}
// --- 注销 // --- 注销
/** /**
@@ -959,7 +986,7 @@ public class StpLogic {
* @return 对应的扩展数据 * @return 对应的扩展数据
*/ */
public Object getExtra(String key) { public Object getExtra(String key) {
throw new ApiDisabledException().setCode(SaErrorCode.CODE_11031); throw new ApiDisabledException("只有在集成 sa-token-jwt 插件后才可以使用 extra 扩展参数").setCode(SaErrorCode.CODE_11031);
} }
/** /**
@@ -970,7 +997,7 @@ public class StpLogic {
* @return 对应的扩展数据 * @return 对应的扩展数据
*/ */
public Object getExtra(String tokenValue, String key) { public Object getExtra(String tokenValue, String key) {
throw new ApiDisabledException().setCode(SaErrorCode.CODE_11031); throw new ApiDisabledException("只有在集成 sa-token-jwt 插件后才可以使用 extra 扩展参数").setCode(SaErrorCode.CODE_11031);
} }
// ---- 其它操作 // ---- 其它操作
@@ -2640,7 +2667,6 @@ public class StpLogic {
return getConfig().getMaxTryTimes(); return getConfig().getMaxTryTimes();
} }
/** /**
* 返回持久化对象 * 返回持久化对象
* *
@@ -2661,4 +2687,13 @@ public class StpLogic {
return SaStrategy.me.hasElement.apply(list, element); return SaStrategy.me.hasElement.apply(list, element);
} }
/**
* 当前 StpLogic 对象是否支持 token 扩展参数
*
* @return /
*/
public boolean isSupportExtra() {
return false;
}
} }
@@ -1,18 +1,16 @@
package com.pj.test; package com.pj.test;
import java.util.Date;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.pj.util.AjaxJson;
import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.stp.SaTokenInfo; import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.pj.util.AjaxJson;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
/** /**
* 测试专用Controller * 测试专用Controller
@@ -30,8 +28,8 @@ public class TestJwtController {
System.out.println("当前会话的token:" + StpUtil.getTokenValue()); System.out.println("当前会话的token:" + StpUtil.getTokenValue());
System.out.println("当前是否登录:" + StpUtil.isLogin()); System.out.println("当前是否登录:" + StpUtil.isLogin());
System.out.println("当前登录账号:" + StpUtil.getLoginIdDefaultNull()); System.out.println("当前登录账号:" + StpUtil.getLoginIdDefaultNull());
StpUtil.login(id); // 在当前会话登录此账号 StpUtil.login(id); // 在当前会话登录此账号
System.out.println("登录成功"); System.out.println("登录成功");
System.out.println("当前是否登录:" + StpUtil.isLogin()); System.out.println("当前是否登录:" + StpUtil.isLogin());
System.out.println("当前登录账号:" + StpUtil.getLoginId()); System.out.println("当前登录账号:" + StpUtil.getLoginId());
@@ -16,6 +16,8 @@ sa-token:
is-share: true is-share: true
# token风格 # token风格
token-style: uuid token-style: uuid
# 是否打印操作日志
is-log: true
# jwt秘钥 # jwt秘钥
jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk
@@ -26,6 +26,7 @@ public class TestController {
@RequestMapping("test") @RequestMapping("test")
public SaResult test() { public SaResult test() {
System.out.println("------------进来了"); System.out.println("------------进来了");
StpUtil.getExtra("name");
// 返回 // 返回
return SaResult.data(""); return SaResult.data("");
} }
@@ -245,4 +245,12 @@ public class StpLogicJwtForMixin extends StpLogic {
return -1; return -1;
} }
/**
* 重写返回:支持 extra 扩展参数
*/
@Override
public boolean isSupportExtra() {
return true;
}
} }
@@ -81,12 +81,20 @@ public class StpLogicJwtForSimple extends StpLogic {
return SaJwtUtil.getPayloadsNotCheck(tokenValue, loginType, jwtSecretKey()).get(key); return SaJwtUtil.getPayloadsNotCheck(tokenValue, loginType, jwtSecretKey()).get(key);
} }
@Override @Override
public boolean getConfigOfIsShare() { public boolean getConfigOfIsShare() {
// 为确保 jwt-simple 模式的 token Extra 数据生成不受旧token影响,这里必须让 is-share 恒为 false // 为确保 jwt-simple 模式的 token Extra 数据生成不受旧token影响,这里必须让 is-share 恒为 false
// 即:在使用 jwt-simple 模式后,即使配置了 is-share=true 也不能复用旧 Token,必须每次创建新 Token // 即:在使用 jwt-simple 模式后,即使配置了 is-share=true 也不能复用旧 Token,必须每次创建新 Token
return false; return false;
} }
/**
* 重写返回:支持 extra 扩展参数
*/
@Override
public boolean isSupportExtra() {
return true;
}
} }
@@ -15,8 +15,6 @@
*/ */
package cn.dev33.satoken.jwt; package cn.dev33.satoken.jwt;
import java.util.Map;
import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.exception.ApiDisabledException; import cn.dev33.satoken.exception.ApiDisabledException;
@@ -29,6 +27,8 @@ import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaFoxUtil; import cn.dev33.satoken.util.SaFoxUtil;
import java.util.Map;
/** /**
* Sa-Token 整合 jwt -- Stateless 无状态模式 * Sa-Token 整合 jwt -- Stateless 无状态模式
* *
@@ -106,17 +106,20 @@ public class StpLogicJwtForStateless extends StpLogic {
*/ */
@Override @Override
public String createLoginSession(Object id, SaLoginModel loginModel) { public String createLoginSession(Object id, SaLoginModel loginModel) {
SaJwtException.throwByNull(id, "账号id不能为空", SaJwtErrorCode.CODE_30206);
// 1、先检查一下,传入的参数是否有效
// ------ 1、初始化 loginModel checkLoginArgs(id, loginModel);
// 2、初始化 loginModel ,给一些参数补上默认值
loginModel.build(getConfig()); loginModel.build(getConfig());
// ------ 2、生成一个token // 3、生成一个token
String tokenValue = createTokenValue(id, loginModel.getDeviceOrDefault(), loginModel.getTimeout(), loginModel.getExtraData()); String tokenValue = createTokenValue(id, loginModel.getDeviceOrDefault(), loginModel.getTimeout(), loginModel.getExtraData());
// $$ 发布事件:账号xxx 登录成功 // 4、$$ 发布事件:账号xxx 登录成功
SaTokenEventCenter.doLogin(loginType, id, tokenValue, loginModel); SaTokenEventCenter.doLogin(loginType, id, tokenValue, loginModel);
// 5、返回
return tokenValue; return tokenValue;
} }
@@ -212,6 +215,13 @@ public class StpLogicJwtForStateless extends StpLogic {
public SaTokenDao getSaTokenDao() { public SaTokenDao getSaTokenDao() {
throw new ApiDisabledException(); throw new ApiDisabledException();
} }
/**
* 重写返回:支持 extra 扩展参数
*/
@Override
public boolean isSupportExtra() {
return true;
}
} }