getPermissionList() {
- return stpLogic.getPermissionList();
- }
-
// =================== id 反查token 相关操作 ===================
@@ -819,6 +848,7 @@ public class StpUserUtil {
* 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2
* @param loginId 账号id
*/
+ @Deprecated
public static void logoutByLoginId(Object loginId) {
stpLogic.kickout(loginId);
}
@@ -831,6 +861,7 @@ public class StpUserUtil {
* @param loginId 账号id
* @param device 设备标识 (填null代表所有注销设备)
*/
+ @Deprecated
public static void logoutByLoginId(Object loginId, String device) {
stpLogic.kickout(loginId, device);
}
diff --git a/sa-token-doc/doc/_sidebar.md b/sa-token-doc/doc/_sidebar.md
index cf267936..d3ee2e71 100644
--- a/sa-token-doc/doc/_sidebar.md
+++ b/sa-token-doc/doc/_sidebar.md
@@ -65,6 +65,7 @@
- [持久层扩展](/plugin/dao-extend)
- [和 Thymeleaf 集成](/plugin/thymeleaf-extend)
- [和 jwt 集成](/plugin/jwt-extend)
+ - [和 Dubbo 集成](/plugin/dubbo-extend)
- **其它**
- [更新日志](/more/update-log)
diff --git a/sa-token-doc/doc/more/sa-token-donate.md b/sa-token-doc/doc/more/sa-token-donate.md
index 9e434118..7fc74692 100644
--- a/sa-token-doc/doc/more/sa-token-donate.md
+++ b/sa-token-doc/doc/more/sa-token-donate.md
@@ -19,6 +19,9 @@ Sa-Token 采用 Apache-2.0 开源协议,**承诺框架本身与官网文档永
| 赞助人 | 赞助金额 | 留言 | 时间 |
| :-------- | :-------- | :-------- | :-------- |
+| songfazhun | ¥ 10 | 感谢您的开源项目! | 2021-10-28 |
+| ithorns | ¥ 10 | 感谢您的开源项目! | 2021-10-25 |
+| xiaoyan | ¥ 200 | 节日快乐 | 2021-10-24 |
| apifox001 | ¥ 200 | 开源不易,Apifox(apifox.cn)和你们一起加油! | 2021-10-15 |
| 永夜 | ¥ 20 | 感谢您的开源项目! | 2021-09-18 |
| 苏永晓 | ¥ 10 | 感谢您的开源项目! | 2021-09-01 |
diff --git a/sa-token-doc/doc/plugin/dubbo-extend.md b/sa-token-doc/doc/plugin/dubbo-extend.md
new file mode 100644
index 00000000..c5bfad89
--- /dev/null
+++ b/sa-token-doc/doc/plugin/dubbo-extend.md
@@ -0,0 +1,148 @@
+# 和 Dubbo 集成
+
+本插件的作用是让 Sa-Token 和 Dubbo 做一个整合。
+
+---
+
+### 先说说要解决的问题
+
+在 Dubbo 的整个调用链中,代码被分为 Consumer 端和 Provider 端,为方便理解我们可以称其为 `[调用端]` 和 `[被调用端]`。
+
+RPC 模式的调用,可以让我们像调用本地方法一样完成服务通信,然而这种便利下却隐藏着两个问题:
+
+- 上下文环境的丢失。
+- 上下文参数的丢失。
+
+这种问题作用在 Sa-Token 框架上就是,在 [ 被调用端 ] 调用 Sa-Token 相关API会抛出异常:**`无效上下文`**。
+
+所以本插件的目的也就是解决上述两个问题:
+
+- 在 [ 被调用端 ] 提供以 Dubbo 为基础的上下文环境
+- 在 RPC 调用时将 Token 传递至 [ 被调用端 ],同时在调用结束时将 Token 回传至 [ 调用端 ]。
+
+
+### 引入插件
+
+在项目已经引入 Dubbo 的基础上,继续添加依赖(Consumer 端和 Provider 端都需要引入):
+
+``` xml
+
+
+ cn.dev33
+ sa-token-context-dubbo
+ ${sa.top.version}
+
+```
+
+
+然后我们就可以愉快的做到以下事情:
+
+1. 在 [ 被调用端 ] 安全的调用 Sa-Token 相关 API。
+2. 在 [ 调用端 ] 登录的会话,其登录状态可以自动传递到 [ 被调用端 ] 。
+3. 在 [ 被调用端 ] 登录的会话,其登录状态也会自动回传到 [ 调用端 ] 。
+
+但是我们仍具有以下限制:
+
+1. [ 调用端 ] 与 [ 被调用端 ] 的 `SaStorage` 数据无法互通。
+2. [ 被调用端 ] 执行的 `SaResponse.setHeader()`、`setStatus()` 等代码无效。
+
+应该合理避开以上 API 的使用。
+
+
+### RPC调用鉴权
+
+在之前的 [Id-Token](/micro/id-token) 章节,我们演示了基于 Feign 的 RPC 调用鉴权,下面我们演示一下在 Dubbo 中如何集成 Id-Token 模块。
+
+其实思路和 Feign 模式一致,在 [ 调用端 ] 追加 Id-Token 参数,在 [ 被调用端 ] 校验这个 Id-Token 参数:
+
+- 校验通过:调用成功。
+- 校验不通过:通过失败,抛出异常。
+
+我们有两种方式完成整合。
+
+##### 方式一、使用配置
+
+直接在 `application.yml` 配置即可:
+
+``` yml
+sa-token:
+ # 打开 RPC 调用鉴权
+ check-id-token: true
+```
+
+
+##### 方式二、自建 Dubbo 过滤器校验
+
+1、在 [ 调用端 ] 的 `\resources\META-INF\dubbo\` 目录新建 `org.apache.dubbo.rpc.Filter` 文件
+``` html
+dubboConsumerFilter=com.pj.DubboConsumerFilter
+```
+
+新建 `DubboConsumerFilter.java` 过滤器
+
+``` java
+package com.pj;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.rpc.*;
+
+import cn.dev33.satoken.id.SaIdUtil;
+
+/**
+ * Sa-Token 整合 Dubbo Consumer端过滤器
+ */
+@Activate(group = {CommonConstants.CONSUMER}, order = -10000)
+public class DubboConsumerFilter implements Filter {
+
+ @Override
+ public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {
+
+ // 追加 Id-Token 参数
+ RpcContext.getContext().setAttachment(SaIdUtil.ID_TOKEN, SaIdUtil.getToken());
+
+ // 开始调用
+ return invoker.invoke(invocation);
+ }
+
+}
+```
+
+
+2、在 [ 被调用端 ] 的 `\resources\META-INF\dubbo\` 目录新建 `org.apache.dubbo.rpc.Filter` 文件
+``` html
+dubboProviderFilter=com.pj.DubboProviderFilter
+```
+
+新建 `DubboProviderFilter.java` 过滤器
+
+``` java
+package com.pj;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.rpc.*;
+
+import cn.dev33.satoken.id.SaIdUtil;
+
+/**
+ * Sa-Token 整合 Dubbo Provider端过滤器
+ */
+@Activate(group = {CommonConstants.PROVIDER}, order = -10000)
+public class DubboProviderFilter implements Filter {
+
+ @Override
+ public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {
+
+ // 取出 Id-Token 进行校验
+ String idToken = invocation.getAttachment(SaIdUtil.ID_TOKEN);
+ SaIdUtil.checkToken(idToken);
+
+ // 开始调用
+ return invoker.invoke(invocation);
+ }
+
+}
+```
+
+然后我们就可以进行安全的 RPC 调用了,不带有 Id-Token 参数的调用都会抛出异常,无法调用成功。
diff --git a/sa-token-doc/doc/sso/readme.md b/sa-token-doc/doc/sso/readme.md
index a5111a1c..3a9a3568 100644
--- a/sa-token-doc/doc/sso/readme.md
+++ b/sa-token-doc/doc/sso/readme.md
@@ -19,9 +19,9 @@
| 系统架构 | 采用模式 | 简介 | 文档链接 |
| :-------- | :-------- | :-------- | :-------- |
-| 前端同域 + 后端同 Redis | 模式一 | 共享 Cookie 同步会话 | [文档](/sso/sso-type1)、[示例](https://gitee.com/dromara/sa-token/blob/dev/sa-token-demo/sa-token-demo-sso1-client) |
-| 前端不同域 + 后端同 Redis | 模式二 | URL重定向传播会话 | [文档](/sso/sso-type2)、[示例](https://gitee.com/dromara/sa-token/blob/dev/sa-token-demo/sa-token-demo-sso2-client) |
-| 前端不同域 + 后端不同 Redis | 模式三 | Http请求获取会话 | [文档](/sso/sso-type3)、[示例](https://gitee.com/dromara/sa-token/blob/dev/sa-token-demo/sa-token-demo-sso3-client) |
+| 前端同域 + 后端同 Redis | 模式一 | 共享 Cookie 同步会话 | [文档](/sso/sso-type1)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso1-client) |
+| 前端不同域 + 后端同 Redis | 模式二 | URL重定向传播会话 | [文档](/sso/sso-type2)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso2-client) |
+| 前端不同域 + 后端不同 Redis | 模式三 | Http请求获取会话 | [文档](/sso/sso-type3)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso3-client) |
1. 前端同域:就是指多个系统可以部署在同一个主域名之下,比如:`c1.domain.com`、`c2.domain.com`、`c3.domain.com`。
diff --git a/sa-token-doc/doc/use/config.md b/sa-token-doc/doc/use/config.md
index 42694d62..93e8a678 100644
--- a/sa-token-doc/doc/use/config.md
+++ b/sa-token-doc/doc/use/config.md
@@ -94,7 +94,8 @@ PS:两者的区别在于:**`模式1会覆盖yml中的配置,模式2会与y
| jwtSecretKey | String | null | jwt秘钥 (只有集成 `sa-token-temp-jwt` 模块时此参数才会生效) |
| idTokenTimeout | long | 86400 | Id-Token的有效期 (单位: 秒) |
| basic | String | "" | Http Basic 认证的账号和密码 [参考:Http Basic 认证](/up/basic-auth) |
-| currDomain | null | "" | 配置当前项目的网络访问地址 |
+| currDomain | Boolean | false | 是否校验Id-Token(部分rpc插件有效) |
+| checkIdToken | false | false | 配置当前项目的网络访问地址 |
| sso | Object | new SaSsoConfig() | SSO 单点登录相关配置 |
| cookie | Object | new SaCookieConfig() | Cookie配置对象 |
diff --git a/sa-token-doc/index.html b/sa-token-doc/index.html
index 3d986a4e..b701d0fb 100644
--- a/sa-token-doc/index.html
+++ b/sa-token-doc/index.html
@@ -311,7 +311,7 @@
-
+
@@ -442,6 +442,42 @@
content: content
});
})
+
+ // set 一下 img 的宽度
+ function setImgWidth(img) {
+ // 如果已经有了宽度参数,则不追加
+ if(img.src.indexOf('?') > -1) {
+ return;
+ }
+ // console.log(img.getAttribute('nf'));
+ if(img.getAttribute('nf') != null) {
+ return;
+ }
+ img.src = img.src + "?x-oss-process=image/resize,m_lfit,w_" + (img.width) + ",limit_0/auto-orient,0";
+ }
+
+ // set 一遍 img 的尺寸,防止失真
+ function f5ImgSize() {
+ $('.com-box-f .com-box a img').each(function() {
+ // console.log(this.src, this.width);
+ // 未加载完毕时,则等待其load之后再设置
+ if(this.complete == false) {
+ this.onload = function() {
+ setImgWidth(this);
+ }
+ return;
+ }
+ // 追加宽度参数
+ setImgWidth(this);
+ })
+ }
+ if(window.innerWidth > 1800) {
+ if(navigator.userAgent.indexOf('WebKit') > -1) {
+ f5ImgSize();
+ }
+ }
+
+