diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java index 62b6cf5e..33754d2c 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java @@ -394,10 +394,8 @@ public class StpLogic { */ public String createLoginSession(Object id, SaLoginModel loginModel) { - // 1、先检查一下,传入的账号id是否可用 - if(SaFoxUtil.isEmpty(id)) { - throw new SaTokenException("账号 id 不能为空").setCode(SaErrorCode.CODE_11002); - } + // 1、先检查一下,传入的参数是否有效 + checkLoginArgs(id, loginModel); // 2、初始化 loginModel ,给一些参数补上默认值 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 extraData = loginModel.getExtraData(); + if(extraData != null && extraData.size() > 0) { + SaManager.log.warn("当前 StpLogic 不支持 extra 扩展参数模式,传入的 extra 数据将被忽略"); + } + } + + } + // --- 注销 /** @@ -959,7 +986,7 @@ public class StpLogic { * @return 对应的扩展数据 */ 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 对应的扩展数据 */ 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(); } - /** * 返回持久化对象 * @@ -2661,4 +2687,13 @@ public class StpLogic { return SaStrategy.me.hasElement.apply(list, element); } + /** + * 当前 StpLogic 对象是否支持 token 扩展参数 + * + * @return / + */ + public boolean isSupportExtra() { + return false; + } + } diff --git a/sa-token-demo/sa-token-demo-jwt/src/main/java/com/pj/test/TestJwtController.java b/sa-token-demo/sa-token-demo-jwt/src/main/java/com/pj/test/TestJwtController.java index 218ae733..4a64dae5 100644 --- a/sa-token-demo/sa-token-demo-jwt/src/main/java/com/pj/test/TestJwtController.java +++ b/sa-token-demo/sa-token-demo-jwt/src/main/java/com/pj/test/TestJwtController.java @@ -1,18 +1,16 @@ 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.stp.SaTokenInfo; 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 @@ -30,8 +28,8 @@ public class TestJwtController { System.out.println("当前会话的token:" + StpUtil.getTokenValue()); System.out.println("当前是否登录:" + StpUtil.isLogin()); System.out.println("当前登录账号:" + StpUtil.getLoginIdDefaultNull()); - - StpUtil.login(id); // 在当前会话登录此账号 + + StpUtil.login(id); // 在当前会话登录此账号 System.out.println("登录成功"); System.out.println("当前是否登录:" + StpUtil.isLogin()); System.out.println("当前登录账号:" + StpUtil.getLoginId()); diff --git a/sa-token-demo/sa-token-demo-jwt/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-jwt/src/main/resources/application.yml index 0f148e62..f0cf4189 100644 --- a/sa-token-demo/sa-token-demo-jwt/src/main/resources/application.yml +++ b/sa-token-demo/sa-token-demo-jwt/src/main/resources/application.yml @@ -16,6 +16,8 @@ sa-token: is-share: true # token风格 token-style: uuid + # 是否打印操作日志 + is-log: true # jwt秘钥 jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk diff --git a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/test/TestController.java b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/test/TestController.java index 39433de4..9c682c0e 100644 --- a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/test/TestController.java +++ b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/test/TestController.java @@ -26,6 +26,7 @@ public class TestController { @RequestMapping("test") public SaResult test() { System.out.println("------------进来了"); + StpUtil.getExtra("name"); // 返回 return SaResult.data(""); } diff --git a/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForMixin.java b/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForMixin.java index c024ec66..adad63a3 100644 --- a/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForMixin.java +++ b/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForMixin.java @@ -245,4 +245,12 @@ public class StpLogicJwtForMixin extends StpLogic { return -1; } + /** + * 重写返回:支持 extra 扩展参数 + */ + @Override + public boolean isSupportExtra() { + return true; + } + } diff --git a/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForSimple.java b/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForSimple.java index a5492297..91f26d82 100644 --- a/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForSimple.java +++ b/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForSimple.java @@ -81,12 +81,20 @@ public class StpLogicJwtForSimple extends StpLogic { return SaJwtUtil.getPayloadsNotCheck(tokenValue, loginType, jwtSecretKey()).get(key); } - + @Override public boolean getConfigOfIsShare() { // 为确保 jwt-simple 模式的 token Extra 数据生成不受旧token影响,这里必须让 is-share 恒为 false // 即:在使用 jwt-simple 模式后,即使配置了 is-share=true 也不能复用旧 Token,必须每次创建新 Token return false; } - + + /** + * 重写返回:支持 extra 扩展参数 + */ + @Override + public boolean isSupportExtra() { + return true; + } + } diff --git a/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForStateless.java b/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForStateless.java index ce195769..a21ebcab 100644 --- a/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForStateless.java +++ b/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForStateless.java @@ -15,8 +15,6 @@ */ package cn.dev33.satoken.jwt; -import java.util.Map; - import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.dao.SaTokenDao; 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.util.SaFoxUtil; +import java.util.Map; + /** * Sa-Token 整合 jwt -- Stateless 无状态模式 * @@ -106,17 +106,20 @@ public class StpLogicJwtForStateless extends StpLogic { */ @Override public String createLoginSession(Object id, SaLoginModel loginModel) { - SaJwtException.throwByNull(id, "账号id不能为空", SaJwtErrorCode.CODE_30206); - - // ------ 1、初始化 loginModel + + // 1、先检查一下,传入的参数是否有效 + checkLoginArgs(id, loginModel); + + // 2、初始化 loginModel ,给一些参数补上默认值 loginModel.build(getConfig()); - // ------ 2、生成一个token + // 3、生成一个token String tokenValue = createTokenValue(id, loginModel.getDeviceOrDefault(), loginModel.getTimeout(), loginModel.getExtraData()); - // $$ 发布事件:账号xxx 登录成功 + // 4、$$ 发布事件:账号xxx 登录成功 SaTokenEventCenter.doLogin(loginType, id, tokenValue, loginModel); - + + // 5、返回 return tokenValue; } @@ -212,6 +215,13 @@ public class StpLogicJwtForStateless extends StpLogic { public SaTokenDao getSaTokenDao() { throw new ApiDisabledException(); } - - + + /** + * 重写返回:支持 extra 扩展参数 + */ + @Override + public boolean isSupportExtra() { + return true; + } + }