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; }