diff --git a/sa-token-plugin/pom.xml b/sa-token-plugin/pom.xml index 80213083..9d9a871a 100644 --- a/sa-token-plugin/pom.xml +++ b/sa-token-plugin/pom.xml @@ -33,6 +33,7 @@ sa-token-temp-jwt sa-token-jwt sa-token-context-dubbo + sa-token-context-dubbo3 sa-token-context-grpc diff --git a/sa-token-plugin/sa-token-context-dubbo3/pom.xml b/sa-token-plugin/sa-token-context-dubbo3/pom.xml new file mode 100644 index 00000000..76ebd5d4 --- /dev/null +++ b/sa-token-plugin/sa-token-context-dubbo3/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + cn.dev33 + sa-token-plugin + ${revision} + ../pom.xml + + + sa-token-context-dubbo3 + sa-token-context-dubbo3 + sa-token-context-dubbo3 + + + + 3.1.5 + 8 + 8 + UTF-8 + + + + + + cn.dev33 + sa-token-core + + + + + org.apache.dubbo + dubbo + ${dubbo3.version} + + + + \ No newline at end of file diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/SaTokenSecondContextCreatorForDubbo3.java b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/SaTokenSecondContextCreatorForDubbo3.java new file mode 100644 index 00000000..4494dbab --- /dev/null +++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/SaTokenSecondContextCreatorForDubbo3.java @@ -0,0 +1,20 @@ +package cn.dev33.satoken.context.dubbo3; + + +import cn.dev33.satoken.context.second.SaTokenSecondContext; +import cn.dev33.satoken.context.second.SaTokenSecondContextCreator; + +/** + * Sa-Token 二级Context - 创建器 [Dubbo3版] + * + * @author kong + * + */ +public class SaTokenSecondContextCreatorForDubbo3 implements SaTokenSecondContextCreator { + + @Override + public SaTokenSecondContext create() { + return new SaTokenSecondContextForDubbo3(); + } + +} diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/SaTokenSecondContextForDubbo3.java b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/SaTokenSecondContextForDubbo3.java new file mode 100644 index 00000000..c254ff0c --- /dev/null +++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/SaTokenSecondContextForDubbo3.java @@ -0,0 +1,46 @@ +package cn.dev33.satoken.context.dubbo3; + +import cn.dev33.satoken.context.dubbo3.model.SaRequestForDubbo3; +import cn.dev33.satoken.context.dubbo3.model.SaResponseForDubbo3; +import cn.dev33.satoken.context.dubbo3.model.SaStorageForDubbo3; +import cn.dev33.satoken.context.model.SaRequest; +import cn.dev33.satoken.context.model.SaResponse; +import cn.dev33.satoken.context.model.SaStorage; +import cn.dev33.satoken.context.second.SaTokenSecondContext; +import cn.dev33.satoken.exception.ApiDisabledException; +import org.apache.dubbo.rpc.RpcContext; + +/** + * Sa-Token 上下文 [Dubbo3版本] + * + * @author kong + * + */ +public class SaTokenSecondContextForDubbo3 implements SaTokenSecondContext { + + @Override + public SaRequest getRequest() { + return new SaRequestForDubbo3(RpcContext.getServiceContext()); + } + + @Override + public SaResponse getResponse() { + return new SaResponseForDubbo3(RpcContext.getServiceContext()); + } + + @Override + public SaStorage getStorage() { + return new SaStorageForDubbo3(RpcContext.getServiceContext()); + } + + @Override + public boolean matchPath(String pattern, String path) { + throw new ApiDisabledException(); + } + + @Override + public boolean isValid() { + return RpcContext.getServiceContext() != null; + } + +} diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ConsumerFilter.java b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ConsumerFilter.java new file mode 100644 index 00000000..cc63a641 --- /dev/null +++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ConsumerFilter.java @@ -0,0 +1,45 @@ +package cn.dev33.satoken.context.dubbo3.filter; + +import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.context.SaTokenContextDefaultImpl; +import cn.dev33.satoken.same.SaSameUtil; +import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.util.SaTokenConsts; +import org.apache.dubbo.common.constants.CommonConstants; +import org.apache.dubbo.common.extension.Activate; +import org.apache.dubbo.rpc.*; + +/** + * + * Sa-Token 整合 Dubbo3 Consumer端过滤器 + * + * @author kong + * + */ +@Activate(group = {CommonConstants.CONSUMER}, order = -30000) +public class SaTokenDubbo3ConsumerFilter implements Filter { + + @Override + public Result invoke(Invoker invoker, Invocation invocation) throws RpcException { + + // 追加 Same-Token 参数 + if(SaManager.getConfig().getCheckSameToken()) { + RpcContext.getServiceContext().setAttachment(SaSameUtil.SAME_TOKEN,SaSameUtil.getToken()); + } + + // 1. 调用前,向下传递会话Token + if(SaManager.getSaTokenContextOrSecond() != SaTokenContextDefaultImpl.defaultContext) { + RpcContext.getServiceContext().setAttachment(SaTokenConsts.JUST_CREATED, StpUtil.getTokenValueNotCut()); + } + + // 2. 开始调用 + Result invoke = invoker.invoke(invocation); + + // 3. 调用后,解析回传的Token值 + StpUtil.setTokenValue(invoke.getAttachment(SaTokenConsts.JUST_CREATED_NOT_PREFIX)); + + // note + return invoke; + } + +} diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ProviderFilter.java b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ProviderFilter.java new file mode 100644 index 00000000..a353c9ac --- /dev/null +++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ProviderFilter.java @@ -0,0 +1,36 @@ +package cn.dev33.satoken.context.dubbo3.filter; + +import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.same.SaSameUtil; +import org.apache.dubbo.common.constants.CommonConstants; +import org.apache.dubbo.common.extension.Activate; +import org.apache.dubbo.rpc.*; + +/** + * + * Sa-Token 整合 Dubbo3 Provider端过滤器 + * + * @author kong + * + */ +@Activate(group = {CommonConstants.PROVIDER}, order = -30000) +public class SaTokenDubbo3ProviderFilter implements Filter { + + @Override + public Result invoke(Invoker invoker, Invocation invocation) throws RpcException { + + // RPC 调用鉴权 + if(SaManager.getConfig().getCheckSameToken()) { + String idToken = invocation.getAttachment(SaSameUtil.SAME_TOKEN); + // dubbo部分协议会将参数变为小写,详细参考:https://gitee.com/dromara/sa-token/issues/I4WXQG + if(idToken == null) { + idToken = invocation.getAttachment(SaSameUtil.SAME_TOKEN.toLowerCase()); + } + SaSameUtil.checkToken(idToken); + } + + // 开始调用 + return invoker.invoke(invocation); + } + +} diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaRequestForDubbo3.java b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaRequestForDubbo3.java new file mode 100644 index 00000000..655cdd95 --- /dev/null +++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaRequestForDubbo3.java @@ -0,0 +1,98 @@ +package cn.dev33.satoken.context.dubbo3.model; + +import cn.dev33.satoken.context.model.SaRequest; +import org.apache.dubbo.rpc.RpcContext; + +/** + * Request for Dubbo3 + * + * @author kong + * + */ +public class SaRequestForDubbo3 implements SaRequest { + + /** + * 底层对象 + */ + protected RpcContext rpcContext; + + /** + * 实例化 + * @param rpcContext rpcContext对象 + */ + public SaRequestForDubbo3(RpcContext rpcContext) { + this.rpcContext = rpcContext; + } + + /** + * 获取底层源对象 + */ + @Override + public Object getSource() { + return rpcContext; + } + + /** + * 在 [请求体] 里获取一个值 + */ + @Override + public String getParam(String name) { + // 不传播 url 参数 + return null; + } + + /** + * 在 [请求头] 里获取一个值 + */ + @Override + public String getHeader(String name) { + // 不传播 header 参数 + return null; + } + + /** + * 在 [Cookie作用域] 里获取一个值 + */ + @Override + public String getCookieValue(String name) { + // 不传播 cookie 参数 + return null; + } + + /** + * 返回当前请求path (不包括上下文名称) + */ + @Override + public String getRequestPath() { + // 不传播 requestPath + return null; + } + + /** + * 返回当前请求的url,例:http://xxx.com/test + * @return see note + */ + public String getUrl() { + // 不传播 url + return null; + } + + /** + * 返回当前请求的类型 + */ + @Override + public String getMethod() { + // 不传播 method + return null; + } + + /** + * 转发请求 + */ + @Override + public Object forward(String path) { + // 不传播 forward 动作 + return null; + } + +} diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaResponseForDubbo3.java b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaResponseForDubbo3.java new file mode 100644 index 00000000..59e933da --- /dev/null +++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaResponseForDubbo3.java @@ -0,0 +1,74 @@ +package cn.dev33.satoken.context.dubbo3.model; + + +import cn.dev33.satoken.context.model.SaResponse; +import org.apache.dubbo.rpc.RpcContext; + +/** + * Response for Servlet + * @author kong + * + */ +public class SaResponseForDubbo3 implements SaResponse { + + /** + * 底层Request对象 + */ + protected RpcContext rpcContext; + + /** + * 实例化 + * @param rpcContext rpcContext对象 + */ + public SaResponseForDubbo3(RpcContext rpcContext) { + this.rpcContext = rpcContext; + } + + /** + * 获取底层源对象 + */ + @Override + public Object getSource() { + return rpcContext; + } + + /** + * 设置响应状态码 + */ + @Override + public SaResponse setStatus(int sc) { + // 不回传 status 状态 + return this; + } + + /** + * 在响应头里写入一个值 + */ + @Override + public SaResponse setHeader(String name, String value) { + // 不回传 header响应头 + return this; + } + + /** + * 在响应头里添加一个值 + * @param name 名字 + * @param value 值 + * @return 对象自身 + */ + public SaResponse addHeader(String name, String value) { + // 不回传 header响应头 + return this; + } + + /** + * 重定向 + */ + @Override + public Object redirect(String url) { + // 不回传 重定向 动作 + return null; + } + + +} diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaStorageForDubbo3.java b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaStorageForDubbo3.java new file mode 100644 index 00000000..686ae5e2 --- /dev/null +++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaStorageForDubbo3.java @@ -0,0 +1,65 @@ +package cn.dev33.satoken.context.dubbo3.model; + +import cn.dev33.satoken.context.model.SaStorage; +import cn.dev33.satoken.util.SaTokenConsts; +import org.apache.dubbo.rpc.RpcContext; + +/** + * Storage for Servlet + * @author kong + * + */ +public class SaStorageForDubbo3 implements SaStorage { + + /** + * 底层对象 + */ + protected RpcContext rpcContext; + + /** + * 实例化 + * @param rpcContext rpcContext对象 + */ + public SaStorageForDubbo3(RpcContext rpcContext) { + this.rpcContext = rpcContext; + } + + /** + * 获取底层源对象 + */ + @Override + public Object getSource() { + return rpcContext; + } + + /** + * 在 [Request作用域] 里写入一个值 + */ + @Override + public SaStorageForDubbo3 set(String key, Object value) { + rpcContext.setObjectAttachment(key, value); + // 如果是token写入,则回传到Consumer端 + if(key.equals(SaTokenConsts.JUST_CREATED_NOT_PREFIX)) { + RpcContext.getServerContext().setAttachment(key, value); + } + return this; + } + + /** + * 在 [Request作用域] 里获取一个值 + */ + @Override + public Object get(String key) { + return rpcContext.getObjectAttachment(key); + } + + /** + * 在 [Request作用域] 里删除一个值 + */ + @Override + public SaStorageForDubbo3 delete(String key) { + rpcContext.removeAttachment(key); + return this; + } + +} diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter b/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter new file mode 100644 index 00000000..739e5457 --- /dev/null +++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter @@ -0,0 +1,2 @@ +saTokenDubbo3ConsumerFilter=cn.dev33.satoken.context.dubbo3.filter.SaTokenDubbo3ConsumerFilter +saTokenDubbo3ProviderFilter=cn.dev33.satoken.context.dubbo3.filter.SaTokenDubbo3ProviderFilter \ No newline at end of file diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/spring.factories b/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..844bf4bd --- /dev/null +++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.dev33.satoken.context.dubbo3.SaTokenSecondContextCreatorForDubbo3 \ No newline at end of file diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..cff10092 --- /dev/null +++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +cn.dev33.satoken.context.dubbo3.SaTokenSecondContextCreatorForDubbo3 \ No newline at end of file diff --git a/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/web/SaQuickController.java b/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/web/SaQuickController.java index 99826d00..b3d5c5bd 100644 --- a/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/web/SaQuickController.java +++ b/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/web/SaQuickController.java @@ -22,7 +22,7 @@ public class SaQuickController { /** * 进入登录页面 - * @param request see note + * @param model see note * @return see note */ @GetMapping("/saLogin")