diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaRequest.java b/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaRequest.java index 91c0f73f..1971726d 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaRequest.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaRequest.java @@ -20,6 +20,7 @@ import cn.dev33.satoken.exception.SaTokenException; import cn.dev33.satoken.router.SaHttpMethod; import cn.dev33.satoken.util.SaFoxUtil; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -95,7 +96,7 @@ public interface SaRequest { * 获取 [ 请求体 ] 里提交的所有参数名称 * @return 参数名称列表 */ - List getParamNames(); + Collection getParamNames(); /** * 获取 [ 请求体 ] 里提交的所有参数 diff --git a/sa-token-demo/sa-token-demo-solon-redisson/pom.xml b/sa-token-demo/sa-token-demo-solon-redisson/pom.xml index 6118605f..35740552 100644 --- a/sa-token-demo/sa-token-demo-solon-redisson/pom.xml +++ b/sa-token-demo/sa-token-demo-solon-redisson/pom.xml @@ -10,7 +10,7 @@ org.noear solon-parent - 2.7.0 + 3.0.1 diff --git a/sa-token-demo/sa-token-demo-solon/pom.xml b/sa-token-demo/sa-token-demo-solon/pom.xml index 6edda287..dc3a24a8 100644 --- a/sa-token-demo/sa-token-demo-solon/pom.xml +++ b/sa-token-demo/sa-token-demo-solon/pom.xml @@ -10,7 +10,7 @@ org.noear solon-parent - 2.9.1 + 3.0.1 diff --git a/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso-server-solon/pom.xml b/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso-server-solon/pom.xml index e0f63a10..c8f5579d 100644 --- a/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso-server-solon/pom.xml +++ b/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso-server-solon/pom.xml @@ -10,14 +10,13 @@ org.noear solon-parent - 2.7.0 + 3.0.1 1.39.0 - 2.7.0 diff --git a/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso1-client-solon/pom.xml b/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso1-client-solon/pom.xml index 5d7cea06..28c2a930 100644 --- a/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso1-client-solon/pom.xml +++ b/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso1-client-solon/pom.xml @@ -10,7 +10,7 @@ org.noear solon-parent - 2.7.0 + 3.0.1 diff --git a/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso2-client-solon/pom.xml b/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso2-client-solon/pom.xml index d59ea913..ea8d41e8 100644 --- a/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso2-client-solon/pom.xml +++ b/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso2-client-solon/pom.xml @@ -10,7 +10,7 @@ org.noear solon-parent - 2.7.0 + 3.0.1 diff --git a/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso3-client-solon/pom.xml b/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso3-client-solon/pom.xml index a9b6736e..0a478820 100644 --- a/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso3-client-solon/pom.xml +++ b/sa-token-demo/sa-token-demo-sso-for-solon/sa-token-demo-sso3-client-solon/pom.xml @@ -10,7 +10,7 @@ org.noear solon-parent - 2.7.0 + 3.0.1 diff --git a/sa-token-dependencies/pom.xml b/sa-token-dependencies/pom.xml index 67e00ea8..500d1f64 100644 --- a/sa-token-dependencies/pom.xml +++ b/sa-token-dependencies/pom.xml @@ -23,7 +23,7 @@ 3.1.0 6.0.0 3.0.9.RELEASE - 2.7.0 + 3.0.1 1.6.2 3.2.88 4.9.17 diff --git a/sa-token-plugin/sa-token-dubbo/src/main/java/cn/dev33/satoken/context/dubbo/model/SaRequestForDubbo.java b/sa-token-plugin/sa-token-dubbo/src/main/java/cn/dev33/satoken/context/dubbo/model/SaRequestForDubbo.java index 5cebcd25..d4af48ee 100644 --- a/sa-token-plugin/sa-token-dubbo/src/main/java/cn/dev33/satoken/context/dubbo/model/SaRequestForDubbo.java +++ b/sa-token-plugin/sa-token-dubbo/src/main/java/cn/dev33/satoken/context/dubbo/model/SaRequestForDubbo.java @@ -18,6 +18,7 @@ package cn.dev33.satoken.context.dubbo.model; import cn.dev33.satoken.context.model.SaRequest; import org.apache.dubbo.rpc.RpcContext; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -64,7 +65,7 @@ public class SaRequestForDubbo implements SaRequest { * @return 参数名称列表 */ @Override - public List getParamNames(){ + public Collection getParamNames(){ return null; } diff --git a/sa-token-plugin/sa-token-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaRequestForDubbo3.java b/sa-token-plugin/sa-token-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaRequestForDubbo3.java index 73e6d2a1..036fb839 100644 --- a/sa-token-plugin/sa-token-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaRequestForDubbo3.java +++ b/sa-token-plugin/sa-token-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaRequestForDubbo3.java @@ -18,6 +18,7 @@ package cn.dev33.satoken.context.dubbo3.model; import cn.dev33.satoken.context.model.SaRequest; import org.apache.dubbo.rpc.RpcContext; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -64,7 +65,7 @@ public class SaRequestForDubbo3 implements SaRequest { * @return 参数名称列表 */ @Override - public List getParamNames(){ + public Collection getParamNames(){ return null; } diff --git a/sa-token-plugin/sa-token-grpc/src/main/java/cn/dev33/satoken/context/grpc/model/SaRequestForGrpc.java b/sa-token-plugin/sa-token-grpc/src/main/java/cn/dev33/satoken/context/grpc/model/SaRequestForGrpc.java index f6ca8a4d..c8ab9e78 100644 --- a/sa-token-plugin/sa-token-grpc/src/main/java/cn/dev33/satoken/context/grpc/model/SaRequestForGrpc.java +++ b/sa-token-plugin/sa-token-grpc/src/main/java/cn/dev33/satoken/context/grpc/model/SaRequestForGrpc.java @@ -18,6 +18,7 @@ package cn.dev33.satoken.context.grpc.model; import cn.dev33.satoken.context.grpc.context.SaTokenGrpcContext; import cn.dev33.satoken.context.model.SaRequest; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -51,7 +52,7 @@ public class SaRequestForGrpc implements SaRequest { * @return 参数名称列表 */ @Override - public List getParamNames(){ + public Collection getParamNames(){ return null; } diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/consts/SaOAuth2Consts.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/consts/SaOAuth2Consts.java index 9637d125..009467c1 100644 --- a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/consts/SaOAuth2Consts.java +++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/consts/SaOAuth2Consts.java @@ -60,6 +60,7 @@ public class SaOAuth2Consts { public static String pwd = "pwd"; public static String build_redirect_uri = "build_redirect_uri"; public static String Authorization = "Authorization"; + public static String nonce = "nonce"; } /** diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/dao/SaOAuth2Dao.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/dao/SaOAuth2Dao.java index 0c4b3eef..4f4d7856 100644 --- a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/dao/SaOAuth2Dao.java +++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/dao/SaOAuth2Dao.java @@ -170,6 +170,17 @@ public interface SaOAuth2Dao { } } + /** + * 持久化:nonce-索引 + * @param c . + */ + default void saveCodeNonceIndex(CodeModel c) { + if(c == null || SaFoxUtil.isEmpty(c.nonce)) { + return; + } + getSaTokenDao().set(splicingCodeNonceIndexSaveKey(c.code), c.nonce, SaOAuth2Manager.getServerConfig().getCodeTimeout()); + } + // ------------------- delete数据 @@ -404,6 +415,18 @@ public interface SaOAuth2Dao { return getSaTokenDao().get(splicingStateSaveKey(state)); } + /** + * 获取:nonce + * @param code / + * @return / + */ + default String getNonce(String code) { + if(SaFoxUtil.isEmpty(code)) { + return null; + } + return getSaTokenDao().get(splicingCodeNonceIndexSaveKey(code)); + } + // ------------------- 拼接key @@ -510,6 +533,15 @@ public interface SaOAuth2Dao { return getSaTokenConfig().getTokenName() + ":oauth2:state:" + state; } + /** + * 拼接key:code-nonce 索引 参数持久化 + * @param code 授权码 + * @return key + */ + default String splicingCodeNonceIndexSaveKey(String code) { + return getSaTokenConfig().getTokenName() + ":oauth2:code-nonce-index:" + code; + } + // -------- bean 对象代理 diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/generate/SaOAuth2DataGenerateDefaultImpl.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/generate/SaOAuth2DataGenerateDefaultImpl.java index b9f5186e..d78efc6d 100644 --- a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/generate/SaOAuth2DataGenerateDefaultImpl.java +++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/generate/SaOAuth2DataGenerateDefaultImpl.java @@ -31,6 +31,7 @@ import cn.dev33.satoken.oauth2.exception.SaOAuth2Exception; import cn.dev33.satoken.oauth2.exception.SaOAuth2RefreshTokenException; import cn.dev33.satoken.oauth2.strategy.SaOAuth2Strategy; import cn.dev33.satoken.util.SaFoxUtil; +import cn.dev33.satoken.util.SaResult; import java.util.LinkedHashMap; import java.util.List; @@ -58,12 +59,15 @@ public class SaOAuth2DataGenerateDefaultImpl implements SaOAuth2DataGenerate { // 生成新Code String codeValue = SaOAuth2Strategy.instance.createCodeValue.execute(ra.clientId, ra.loginId, ra.scopes); - CodeModel cm = new CodeModel(codeValue, ra.clientId, ra.scopes, ra.loginId, ra.redirectUri); + CodeModel cm = new CodeModel(codeValue, ra.clientId, ra.scopes, ra.loginId, ra.redirectUri, ra.getNonce()); // 保存新Code dao.saveCode(cm); dao.saveCodeIndex(cm); + // 保存code-nonce + dao.saveCodeNonceIndex(cm); + // 返回 return cm; } diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/model/CodeModel.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/model/CodeModel.java index 57653f27..2a76c08f 100644 --- a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/model/CodeModel.java +++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/model/CodeModel.java @@ -52,6 +52,11 @@ public class CodeModel implements Serializable { * 重定向的地址 */ public String redirectUri; + + /** + * 随机数 + */ + public String nonce; /** * 构建一个 @@ -67,13 +72,14 @@ public class CodeModel implements Serializable { * @param loginId 对应的账号id * @param redirectUri 重定向地址 */ - public CodeModel(String code, String clientId, List scopes, Object loginId, String redirectUri) { + public CodeModel(String code, String clientId, List scopes, Object loginId, String redirectUri, String nonce) { super(); this.code = code; this.clientId = clientId; this.scopes = scopes; this.loginId = loginId; this.redirectUri = redirectUri; + this.nonce = nonce; } public String getCode() { @@ -121,10 +127,19 @@ public class CodeModel implements Serializable { return this; } + public String getNonce() { + return nonce; + } + + public CodeModel setNonce(String nonce) { + this.nonce = nonce; + return this; + } + @Override public String toString() { return "CodeModel [code=" + code + ", clientId=" + clientId + ", scopes=" + scopes + ", loginId=" + loginId - + ", redirectUri=" + redirectUri + "]"; + + ", redirectUri=" + redirectUri + ", nonce=" + nonce + " ]"; } } diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/model/request/RequestAuthModel.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/model/request/RequestAuthModel.java index 9837e437..c07d3bf5 100644 --- a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/model/request/RequestAuthModel.java +++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/model/request/RequestAuthModel.java @@ -62,6 +62,11 @@ public class RequestAuthModel implements Serializable { */ public String state; + /** + * 随机数 + */ + public String nonce; + /** * @return clientId @@ -158,7 +163,23 @@ public class RequestAuthModel implements Serializable { this.state = state; return this; } - + + /** + * @return nonce + */ + public String getNonce() { + return nonce; + } + + /** + * @param nonce 要设置的随机数 + * @return 对象自身 + */ + public RequestAuthModel setNonce(String nonce) { + this.nonce = nonce; + return this; + } + /** * 检查此Model参数是否有效 * @return 对象自身 diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/resolver/SaOAuth2DataResolverDefaultImpl.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/resolver/SaOAuth2DataResolverDefaultImpl.java index 64ade8a6..73c1c970 100644 --- a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/resolver/SaOAuth2DataResolverDefaultImpl.java +++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/resolver/SaOAuth2DataResolverDefaultImpl.java @@ -136,6 +136,7 @@ public class SaOAuth2DataResolverDefaultImpl implements SaOAuth2DataResolver { ra.responseType = req.getParamNotNull(Param.response_type); ra.redirectUri = req.getParamNotNull(Param.redirect_uri); ra.state = req.getParam(Param.state); + ra.nonce = req.getParam(Param.nonce); ra.scopes = SaOAuth2Manager.getDataConverter().convertScopeStringToList(req.getParam(Param.scope)); ra.loginId = loginId; return ra; diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/scope/handler/OidcScopeHandler.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/scope/handler/OidcScopeHandler.java index 97c70d1d..426e1133 100644 --- a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/scope/handler/OidcScopeHandler.java +++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/scope/handler/OidcScopeHandler.java @@ -22,6 +22,8 @@ import cn.dev33.satoken.jwt.SaJwtUtil; import cn.dev33.satoken.jwt.error.SaJwtErrorCode; import cn.dev33.satoken.jwt.exception.SaJwtException; import cn.dev33.satoken.oauth2.SaOAuth2Manager; +import cn.dev33.satoken.oauth2.consts.SaOAuth2Consts; +import cn.dev33.satoken.oauth2.dao.SaOAuth2Dao; import cn.dev33.satoken.oauth2.data.model.AccessTokenModel; import cn.dev33.satoken.oauth2.data.model.ClientTokenModel; import cn.dev33.satoken.oauth2.data.model.oidc.IdTokenModel; @@ -104,7 +106,12 @@ public class OidcScopeHandler implements SaOAuth2ScopeHandlerInterface { * @return / */ public String getNonce() { - String nonce = SaHolder.getRequest().getParam("nonce"); + String nonce = SaHolder.getRequest().getParam(SaOAuth2Consts.Param.nonce); + if(SaFoxUtil.isEmpty(nonce)) { + //通过code查找nonce + //为了避免其它handler可能会用到nonce,任由其自然过期,只取用不删除 + nonce = SaOAuth2Manager.getDao().getNonce(SaHolder.getRequest().getParam(SaOAuth2Consts.Param.code)); + } if(SaFoxUtil.isEmpty(nonce)) { nonce = SaFoxUtil.getRandomString(32); } diff --git a/sa-token-starter/sa-token-jakarta-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaRequestForServlet.java b/sa-token-starter/sa-token-jakarta-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaRequestForServlet.java index cc677c3c..493fb067 100644 --- a/sa-token-starter/sa-token-jakarta-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaRequestForServlet.java +++ b/sa-token-starter/sa-token-jakarta-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaRequestForServlet.java @@ -71,13 +71,8 @@ public class SaRequestForServlet implements SaRequest { * @return 参数名称列表 */ @Override - public List getParamNames(){ - Enumeration parameterNames = request.getParameterNames(); - List list = new ArrayList<>(); - while (parameterNames.hasMoreElements()) { - list.add(parameterNames.nextElement()); - } - return list; + public Collection getParamNames(){ + return Collections.list(request.getParameterNames()); } /** diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java index b209afd9..6280a27e 100644 --- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java +++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java @@ -27,10 +27,7 @@ import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilterChain; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * 对 SaRequest 包装类的实现(Reactor 响应式编程版) @@ -74,9 +71,8 @@ public class SaRequestForReactor implements SaRequest { * @return 参数名称列表 */ @Override - public List getParamNames(){ - Set names = request.getQueryParams().keySet(); - return new ArrayList<>(names); + public Collection getParamNames(){ + return request.getQueryParams().keySet(); } /** diff --git a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java b/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java index e656a4b6..65cba177 100644 --- a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java +++ b/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java @@ -27,10 +27,7 @@ import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilterChain; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * 对 SaRequest 包装类的实现(Reactor 响应式编程版) @@ -74,9 +71,8 @@ public class SaRequestForReactor implements SaRequest { * @return 参数名称列表 */ @Override - public List getParamNames(){ - Set names = request.getQueryParams().keySet(); - return new ArrayList<>(names); + public Collection getParamNames(){ + return request.getQueryParams().keySet(); } /** diff --git a/sa-token-starter/sa-token-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaRequestForServlet.java b/sa-token-starter/sa-token-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaRequestForServlet.java index 5088143c..a4023ebe 100644 --- a/sa-token-starter/sa-token-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaRequestForServlet.java +++ b/sa-token-starter/sa-token-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaRequestForServlet.java @@ -71,13 +71,8 @@ public class SaRequestForServlet implements SaRequest { * @return 参数名称列表 */ @Override - public List getParamNames(){ - Enumeration parameterNames = request.getParameterNames(); - List list = new ArrayList<>(); - while (parameterNames.hasMoreElements()) { - list.add(parameterNames.nextElement()); - } - return list; + public Collection getParamNames(){ + return Collections.list(request.getParameterNames()); } /** diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java index a6bb293e..51f869ac 100644 --- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java +++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java @@ -51,21 +51,9 @@ public class XPluginImp implements Plugin { @Override public void start(AppContext context) { - // Sa-Token 日志输出 Bean - context.getBeanAsync(SaLog.class, bean -> { - SaManager.setLog(bean); - }); + context.beanMake(SaSsoAutoConfigure.class); + context.beanMake(SaOAuth2AutoConfigure.class); - - //注入其它 Bean - context.lifecycle(-99, () -> { - beanInitDo(context); - context.beanMake(SaSsoAutoConfigure.class); - context.beanMake(SaOAuth2AutoConfigure.class); - }); - } - - private void beanInitDo(AppContext context) { // 注入上下文Bean SaManager.setSaTokenContext(new SaContextForSolon()); @@ -78,6 +66,12 @@ public class XPluginImp implements Plugin { SaManager.setConfig(saTokenConfig); } + // Sa-Token 日志输出 Bean + context.getBeanAsync(SaLog.class, bean -> { + SaManager.setLog(bean); + }); + + //注入 SaTokenConfig context.getBeanAsync(SaTokenConfig.class, bean -> { SaManager.setConfig(bean); }); @@ -146,6 +140,5 @@ public class XPluginImp implements Plugin { context.getBeanAsync(StpLogic.class, bean -> { StpUtil.setStpLogic(bean); }); - } } \ No newline at end of file diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/dao/SaSessionForJson.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/dao/SaSessionForJson.java deleted file mode 100644 index 98150c58..00000000 --- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/dao/SaSessionForJson.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2020-2099 sa-token.cc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.dev33.satoken.solon.dao; - -import cn.dev33.satoken.session.SaSession; -import cn.dev33.satoken.util.SaFoxUtil; -import org.noear.snack.ONode; - -// 不能删;为保持与旧的序列化兼容 -/** - * Snack3 定制版 SaSession,重写类型转换API - * - * @author noear - * @since 1.12 - */ -@Deprecated -public class SaSessionForJson extends SaSession { - - private static final long serialVersionUID = -7600983549653130681L; - - public SaSessionForJson() { - super(); - } - - /** - * 构建一个 SaSession 对象 - * @param id Session 的 id - */ - public SaSessionForJson(String id) { - super(id); - } - - /** - * 取值 (指定转换类型) - * @param 泛型 - * @param key key - * @param cs 指定转换类型 - * @return 值 - */ - @Override - public T getModel(String key, Class cs) { - if(SaFoxUtil.isBasicType(cs)) { - return SaFoxUtil.getValueByType(get(key), cs); - } - return ONode.deserialize(getString(key), cs); - } - - /** - * 取值 (指定转换类型, 并指定值为Null时返回的默认值) - * @param 泛型 - * @param key key - * @param cs 指定转换类型 - * @param defaultValue 值为Null时返回的默认值 - * @return 值 - */ - @Override - @SuppressWarnings("unchecked") - public T getModel(String key, Class cs, Object defaultValue) { - Object value = get(key); - if(valueIsNull(value)) { - return (T)defaultValue; - } - if(SaFoxUtil.isBasicType(cs)) { - return SaFoxUtil.getValueByType(get(key), cs); - } - return ONode.deserialize(getString(key), cs); - } - - /** - * 忽略 timeout 字段的序列化 - */ - @Override - public long getTimeout() { - return super.getTimeout(); - } - -} diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenFilter.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenFilter.java index b833788d..f8658586 100644 --- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenFilter.java +++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenFilter.java @@ -15,7 +15,6 @@ */ package cn.dev33.satoken.solon.integration; -import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.exception.BackResultException; import cn.dev33.satoken.exception.SaTokenException; import cn.dev33.satoken.exception.StopMatchException; @@ -24,7 +23,6 @@ import cn.dev33.satoken.filter.SaFilterErrorStrategy; import cn.dev33.satoken.filter.SaFilter; import cn.dev33.satoken.router.SaRouter; import cn.dev33.satoken.strategy.SaAnnotationStrategy; -import cn.dev33.satoken.strategy.SaStrategy; import org.noear.solon.Solon; import org.noear.solon.core.handle.*; import org.noear.solon.core.route.RoutingTable; diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaRequestForSolon.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaRequestForSolon.java index 2b820bff..9f32ca6c 100644 --- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaRequestForSolon.java +++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaRequestForSolon.java @@ -20,10 +20,7 @@ import cn.dev33.satoken.context.model.SaRequest; import cn.dev33.satoken.util.SaFoxUtil; import org.noear.solon.core.handle.Context; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * @author noear @@ -33,7 +30,7 @@ public class SaRequestForSolon implements SaRequest { protected Context ctx; - public SaRequestForSolon(){ + public SaRequestForSolon() { ctx = Context.current(); } @@ -48,18 +45,18 @@ public class SaRequestForSolon implements SaRequest { } @Override - public List getParamNames(){ - Set names = ctx.paramMap().keySet(); - return new ArrayList<>(names); + public Collection getParamNames() { + return ctx.paramNames(); } /** * 获取 [请求体] 里提交的所有参数 + * * @return 参数列表 */ @Override - public Map getParamMap(){ - return ctx.paramMap(); + public Map getParamMap() { + return ctx.paramMap().toValueMap(); } @Override @@ -76,31 +73,19 @@ public class SaRequestForSolon implements SaRequest { * 在 [ Cookie作用域 ] 里获取一个值 (第一个此名称的) */ @Override - public String getCookieFirstValue(String name){ + public String getCookieFirstValue(String name) { return ctx.cookie(name); } /** * 在 [ Cookie作用域 ] 里获取一个值 (最后一个此名称的) + * * @param name 键 * @return 值 */ @Override - public String getCookieLastValue(String name){ - String value = null; - String cookieStr = ctx.header("Cookie"); - if(SaFoxUtil.isNotEmpty(cookieStr)) { - String[] cookieItems = cookieStr.split(";"); - for (String item : cookieItems) { - String[] kv = item.split("="); - if (kv.length == 2) { - if (kv[0].trim().equals(name)) { - value = kv[1].trim(); - } - } - } - } - return value; + public String getCookieLastValue(String name) { + return ctx.cookieMap().holder(name).getLastValue(); } @Override @@ -111,7 +96,7 @@ public class SaRequestForSolon implements SaRequest { @Override public String getUrl() { String currDomain = SaManager.getConfig().getCurrDomain(); - if( ! SaFoxUtil.isEmpty(currDomain)) { + if (!SaFoxUtil.isEmpty(currDomain)) { return currDomain + this.getRequestPath(); } return ctx.url(); @@ -127,5 +112,4 @@ public class SaRequestForSolon implements SaRequest { ctx.forward(path); return null; } - } diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java index b214d07b..a591b1d3 100644 --- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java +++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java @@ -48,9 +48,10 @@ public class SaResponseForSolon implements SaResponse { } /** - * 在响应头里添加一个值 - * @param name 名字 - * @param value 值 + * 在响应头里添加一个值 + * + * @param name 名字 + * @param value 值 * @return 对象自身 */ public SaResponse addHeader(String name, String value) { diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/sso/SaSsoAutoConfigure.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/sso/SaSsoAutoConfigure.java index 171ddfc0..e625393f 100644 --- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/sso/SaSsoAutoConfigure.java +++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/sso/SaSsoAutoConfigure.java @@ -27,7 +27,6 @@ import org.noear.solon.annotation.Condition; import org.noear.solon.annotation.Configuration; import org.noear.solon.annotation.Inject; import org.noear.solon.core.AppContext; -import org.noear.solon.core.bean.InitializingBean; /** * @author noear diff --git a/sa-token-starter/sa-token-solon-plugin/src/test/java/demo2/Config.java b/sa-token-starter/sa-token-solon-plugin/src/test/java/demo2/Config.java index 5a4affba..ad6588e6 100644 --- a/sa-token-starter/sa-token-solon-plugin/src/test/java/demo2/Config.java +++ b/sa-token-starter/sa-token-solon-plugin/src/test/java/demo2/Config.java @@ -40,13 +40,15 @@ public class Config { @Bean public void saTokenPathInterceptor2() { - Solon.app().before((ctx) -> { + Solon.app().routerInterceptor((ctx, mainHandler, chain) -> { SaRouter.match("/**", StpUtil::checkLogin); // 根据路由划分模块,不同模块不同鉴权 SaRouter.match("/user/**", r -> StpUtil.checkPermission("user")); SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin")); SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods")); SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders")); + + chain.doIntercept(ctx, mainHandler); }); } }