From f9bd57c884b3f0b037ec8bf434dd6210875e5f85 Mon Sep 17 00:00:00 2001
From: click33 <2393584716@qq.com>
Date: Tue, 8 Feb 2022 16:05:54 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sa-token-doc/doc/fun/token-timeout.md | 2 +-
sa-token-doc/doc/oauth2/oauth2-server.md | 5 ++-
sa-token-doc/doc/plugin/jwt-extend.md | 20 +++++++++-
sa-token-doc/doc/use/config.md | 39 ++++++++++++++-----
.../satoken/oauth2/config/SaOAuth2Config.java | 6 +--
.../oauth2/logic/SaOAuth2Template.java | 4 +-
.../satoken/oauth2/model/SaClientModel.java | 14 +++----
7 files changed, 66 insertions(+), 24 deletions(-)
diff --git a/sa-token-doc/doc/fun/token-timeout.md b/sa-token-doc/doc/fun/token-timeout.md
index aeadfca8..26332a23 100644
--- a/sa-token-doc/doc/fun/token-timeout.md
+++ b/sa-token-doc/doc/fun/token-timeout.md
@@ -7,7 +7,7 @@ Sa-Token 提供两种Token自动过期策略,分别是`timeout`与`activity-ti
### timeout
1. `timeout`代表Token的长久有效期,单位/秒,例如将其配置为 2592000 (30天),代表在30天后,Token必定过期,无法继续使用
-2. `timeout`无法续签,想要继续使用必须重新登录
+2. `timeout`~~无法续签,想要继续使用必须重新登录~~。v1.29.0+ 版本新增续期方法:`StpUtil.renewTimeout(100)`。
3. `timeout`的值配置为-1后,代表永久有效,不会过期
diff --git a/sa-token-doc/doc/oauth2/oauth2-server.md b/sa-token-doc/doc/oauth2/oauth2-server.md
index 46b47b56..a1e191b2 100644
--- a/sa-token-doc/doc/oauth2/oauth2-server.md
+++ b/sa-token-doc/doc/oauth2/oauth2-server.md
@@ -48,7 +48,7 @@ public class SaOAuth2TemplateImpl extends SaOAuth2Template {
.setClientSecret("aaaa-bbbb-cccc-dddd-eeee")
.setAllowUrl("*")
.setContractScope("userinfo")
- .setIsAutoMode(true);
+ .setIsAutoMode(true);
}
return null;
}
@@ -63,6 +63,9 @@ public class SaOAuth2TemplateImpl extends SaOAuth2Template {
}
```
+你可以在 [框架配置](/use/config?id=SaClientModel属性定义) 了解有关 `SaClientModel` 对象所有属性的详细定义
+
+
2、新建`SaOAuth2ServerController`
``` java
/**
diff --git a/sa-token-doc/doc/plugin/jwt-extend.md b/sa-token-doc/doc/plugin/jwt-extend.md
index fcd98b1f..97918f01 100644
--- a/sa-token-doc/doc/plugin/jwt-extend.md
+++ b/sa-token-doc/doc/plugin/jwt-extend.md
@@ -111,8 +111,26 @@ public class LoginController {
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbklkIjoiMTAwMDEiLCJybiI6IjZYYzgySzBHVWV3Uk5NTTl1dFdjbnpFZFZHTVNYd3JOIn0.F_7fbHsFsDZmckHlGDaBuwDotZwAjZ0HB14DRujQfOQ
```
+### 5、扩展参数
+你可以通过以下方式在登录时注入扩展参数:
-### 5、不同模式策略对比
+``` java
+// 登录10001账号,并为生成的 Token 追加扩展参数name
+StpUtil.login(10001, SaLoginConfig.setExtra("name", "zhangsan"));
+
+// 连缀写法追加多个
+StpUtil.login(10001, SaLoginConfig
+ .setExtra("name", "zhangsan")
+ .setExtra("age", 18)
+ .setExtra("role", "超级管理员"));
+
+// 获取扩展参数
+String name = StpUtil.getExtra("name");
+```
+
+
+
+### 6、不同模式策略对比
注入不同模式会让框架具有不同的行为策略,以下是三种模式的差异点(为方便叙述,以下比较以同时引入 jwt 与 Redis 作为前提):
diff --git a/sa-token-doc/doc/use/config.md b/sa-token-doc/doc/use/config.md
index 14a9435f..d6a3502d 100644
--- a/sa-token-doc/doc/use/config.md
+++ b/sa-token-doc/doc/use/config.md
@@ -152,15 +152,16 @@ sa-token:
### OAuth2.0相关配置
| 参数名称 | 类型 | 默认值 | 说明 |
| :-------- | :-------- | :-------- | :-------- |
-| isCode | Boolean | true | 是否打开模式:授权码(Authorization Code) |
-| isImplicit | Boolean | false | 是否打开模式:隐藏式(Implicit) |
-| isPassword | Boolean | false | 是否打开模式:密码式(Password) |
-| isClient | Boolean | false | 是否打开模式:凭证式(Client Credentials) |
-| isNewRefresh | Boolean | false | 是否在每次 Refresh-Token 刷新 Access-Token 时,产生一个新的 Refresh-Token |
-| codeTimeout | long | 300 | Code授权码 保存的时间(单位秒) 默认五分钟 |
-| accessTokenTimeout | long | 7200 | Access-Token 保存的时间(单位秒) 默认两个小时 |
-| refreshTokenTimeout | long | 2592000 | Refresh-Token 保存的时间(单位秒) 默认30 天 |
-| clientTokenTimeout | long | 7200 | Client-Token 保存的时间(单位秒) 默认两个小时 |
+| isCode | Boolean | true | 是否打开模式:授权码(`Authorization Code`) |
+| isImplicit | Boolean | false | 是否打开模式:隐藏式(`Implicit`) |
+| isPassword | Boolean | false | 是否打开模式:密码式(`Password`) |
+| isClient | Boolean | false | 是否打开模式:凭证式(`Client Credentials`) |
+| isNewRefresh | Boolean | false | 是否在每次 `Refresh-Token` 刷新 `Access-Token` 时,产生一个新的 Refresh-Token |
+| codeTimeout | long | 300 | Code授权码 保存的时间(单位:秒) 默认五分钟 |
+| accessTokenTimeout | long | 7200 | `Access-Token` 保存的时间(单位:秒)默认两个小时 |
+| refreshTokenTimeout | long | 2592000 | `Refresh-Token` 保存的时间(单位:秒) 默认30 天 |
+| clientTokenTimeout | long | 7200 | `Client-Token` 保存的时间(单位:秒) 默认两个小时 |
+| pastClientTokenTimeout | long | 7200 | `Past-Client-Token` 保存的时间(单位:秒) ,默认为-1,代表延续 `Client-Token` 的有效时间 |
配置示例:
``` yml
@@ -174,3 +175,23 @@ sa-token:
is-password: true
is-client: true
```
+
+##### SaClientModel属性定义
+| 参数名称 | 类型 | 默认值 | 说明 |
+| :-------- | :-------- | :-------- | :-------- |
+| clientId | String | null | 应用id,应该全局唯一 |
+| clientSecret | String | null | 应用秘钥 |
+| contractScope | String | null | 应用签约的所有权限, 多个用逗号隔开 |
+| allowUrl | String | null | 应用允许授权的所有URL, 多个用逗号隔开 (可以使用 `*` 号通配符) |
+| isCode | Boolean | false | 单独配置此 Client 是否打开模式:授权码(`Authorization Code`) |
+| isImplicit | Boolean | false | 单独配置此 Client 是否打开模式:隐藏式(`Implicit`) |
+| isPassword | Boolean | false | 单独配置此 Client 是否打开模式:密码式(`Password`) |
+| isClient | Boolean | false | 单独配置此 Client 是否打开模式:凭证式(`Client Credentials`) |
+| isAutoMode | Boolean | true | 是否自动判断此 Client 开放的授权模式。
此值为 true 时:四种模式(`isCode、isImplicit、isPassword、isClient`)是否生效,依靠全局设置;
此值为 false 时:四种模式(`isCode、isImplicit、isPassword、isClient`)是否生效,依靠局部配置+全局配置 |
+| isNewRefresh | Boolean | 取全局配置 | 单独配置此Client:是否在每次 `Refresh-Token` 刷新 `Access-Token` 时,产生一个新的 Refresh-Token [ 默认取全局配置 ] |
+| accessTokenTimeout | long | 取全局配置 | 单独配置此Client:`Access-Token` 保存的时间(单位:秒) [默认取全局配置] |
+| refreshTokenTimeout | long | 取全局配置 | 单独配置此Client:`Refresh-Token` 保存的时间(单位:秒) [默认取全局配置] |
+| clientTokenTimeout | long | 取全局配置 | 单独配置此Client:`Client-Token` 保存的时间(单位:秒) [默认取全局配置] |
+| pastClientTokenTimeout | long | 取全局配置 | 单独配置此Client:`Past-Client-Token` 保存的时间(单位:秒) [默认取全局配置] |
+
+
diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/config/SaOAuth2Config.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/config/SaOAuth2Config.java
index 62d3be66..1f6198b2 100644
--- a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/config/SaOAuth2Config.java
+++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/config/SaOAuth2Config.java
@@ -42,8 +42,8 @@ public class SaOAuth2Config implements Serializable {
/** Client-Token 保存的时间(单位:秒) 默认两个小时 */
public long clientTokenTimeout = 60 * 60 * 2;
- /** Past-Client-Token 保存的时间(单位:秒) 默认为 null,代表取 clientTokenTimeout 值 */
- public Long pastClientTokenTimeout = null;
+ /** Past-Client-Token 保存的时间(单位:秒) 默认为 -1,代表延续 Client-Token有效期 */
+ public long pastClientTokenTimeout = -1;
/**
@@ -183,7 +183,7 @@ public class SaOAuth2Config implements Serializable {
/**
* @return pastClientTokenTimeout
*/
- public Long getPastClientTokenTimeout() {
+ public long getPastClientTokenTimeout() {
return pastClientTokenTimeout;
}
diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/logic/SaOAuth2Template.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/logic/SaOAuth2Template.java
index c5b9a316..0e7b4d3a 100644
--- a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/logic/SaOAuth2Template.java
+++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/logic/SaOAuth2Template.java
@@ -256,7 +256,7 @@ public class SaOAuth2Template {
// 2.5、如果配置了 PastClientToken 的 ttl ,则需要更新一下
SaClientModel cm = checkClientModel(clientId);
- if(oldCt != null && cm.getPastClientTokenTimeout() != null) {
+ if(oldCt != null && cm.getPastClientTokenTimeout() != -1) {
oldCt.expiresTime = System.currentTimeMillis() + (cm.getPastClientTokenTimeout() * 1000);
saveClientToken(oldCt);
}
@@ -607,7 +607,7 @@ public class SaOAuth2Template {
}
Long ttl = ct.getExpiresIn();
SaClientModel cm = checkClientModel(ct.clientId);
- if (null != cm.getPastClientTokenTimeout()) {
+ if (cm.getPastClientTokenTimeout() != -1) {
ttl = cm.getPastClientTokenTimeout();
}
SaManager.getSaTokenDao().set(splicingPastTokenIndexKey(ct.clientId), ct.clientToken, ttl);
diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/model/SaClientModel.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/model/SaClientModel.java
index ea0ff687..7d86744b 100644
--- a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/model/SaClientModel.java
+++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/model/SaClientModel.java
@@ -47,11 +47,11 @@ public class SaClientModel implements Serializable {
public Boolean isClient = false;
/**
- * 是否自动判断开放的授权模式
+ * 是否自动判断此 Client 开放的授权模式
*
此值为true时:四种模式(isCode、isImplicit、isPassword、isClient)是否生效,依靠全局设置
*
此值为false时:四种模式(isCode、isImplicit、isPassword、isClient)是否生效,依靠局部配置+全局配置
*/
- public Boolean isAutoMode = false;
+ public Boolean isAutoMode = true;
/** 单独配置此Client:是否在每次 Refresh-Token 刷新 Access-Token 时,产生一个新的 Refresh-Token [默认取全局配置] */
public Boolean isNewRefresh;
@@ -66,7 +66,7 @@ public class SaClientModel implements Serializable {
public long clientTokenTimeout;
/** 单独配置此Client:Past-Client-Token 保存的时间(单位:秒) [默认取全局配置] */
- public Long pastClientTokenTimeout;
+ public long pastClientTokenTimeout;
public SaClientModel() {
@@ -215,14 +215,14 @@ public class SaClientModel implements Serializable {
}
/**
- * @return 是否自动判断开放的授权模式
+ * @return 是否自动判断此 Client 开放的授权模式
*/
public Boolean getIsAutoMode() {
return isAutoMode;
}
/**
- * @param isAutoMode 是否自动判断开放的授权模式
+ * @param isAutoMode 是否自动判断此 Client 开放的授权模式
* @return 对象自身
*/
public SaClientModel setIsAutoMode(Boolean isAutoMode) {
@@ -298,7 +298,7 @@ public class SaClientModel implements Serializable {
/**
* @return 此Client:Past-Client-Token 保存的时间(单位:秒) [默认取全局配置]
*/
- public Long getPastClientTokenTimeout() {
+ public long getPastClientTokenTimeout() {
return pastClientTokenTimeout;
}
@@ -306,7 +306,7 @@ public class SaClientModel implements Serializable {
* @param pastClientTokenTimeout 单独配置此Client:Past-Client-Token 保存的时间(单位:秒) [默认取全局配置]
* @return 对象自身
*/
- public SaClientModel setPastClientTokenTimeout(Long pastClientTokenTimeout) {
+ public SaClientModel setPastClientTokenTimeout(long pastClientTokenTimeout) {
this.pastClientTokenTimeout = pastClientTokenTimeout;
return this;
}