新增登录时动态指定 active-timeout 能力

This commit is contained in:
click33
2023-06-06 06:18:52 +08:00
parent 48ba6da91a
commit 814a64907a
51 changed files with 835 additions and 475 deletions

View File

@@ -90,12 +90,12 @@ StpUtil.getSessionBySessionId("xxxx-xxxx-xxxx"); // 获取指定key的Session,
### 6、Token有效期相关
``` java
// 临时有效期
StpUtil.getTokenActivityTimeout(); // 获取当前 token [临时过期] 剩余有效时间 (单位: 秒)
StpUtil.checkActivityTimeout(); // 检查当前token 是否已经[临时过期],如果已经过期则抛出异常
StpUtil.updateLastActivityToNow(); // 续签当前token(将 [最后操作时间] 更新为当前时间戳)
// Token 最低活跃频率
StpUtil.getTokenActiveTimeout(); // 获取当前 token 距离被冻结还剩多少时间 (单位: 秒)
StpUtil.checkActiveTimeout(); // 检查当前token 是否已经被冻结,如果是则抛出异常
StpUtil.updateLastActiveToNow(); // 续签当前token(将 [最后操作时间] 更新为当前时间戳)
// 长久有效期
// Token 有效期
StpUtil.getTokenTimeout(); // 获取当前登录者的 token 剩余有效时间 (单位: 秒)
StpUtil.getSessionTimeout(); // 获取当前登录者的 Account-Session 剩余有效时间 (单位: 秒)
StpUtil.getTokenSessionTimeout(); // 获取当前 Token-Session 剩余有效时间 (单位: 秒)

View File

@@ -79,7 +79,7 @@ SaToken 中的所有异常都是继承于 `SaTokenException` 的,也就是说
| 11013 | Token已过期 |
| 11014 | Token已被顶下线 |
| 11015 | Token已被踢下线 |
| 11016 | Token已临时过期 |
| 11016 | Token已被冻结 |
| 11031 | 在未集成 sa-token-jwt 插件时调用 getExtra() 抛出异常 |
| 11041 | 缺少指定的角色 |
| 11051 | 缺少指定的权限 |

View File

@@ -15,7 +15,7 @@ token信息Model: 用来描述一个token的常用参数
"tokenTimeout": 2591977, // token剩余有效期 (单位: 秒)
"sessionTimeout": 2591977, // Account-Session剩余有效时间 (单位: 秒)
"tokenSessionTimeout": -2, // Token-Session剩余有效时间 (单位: 秒) (-2表示系统中不存在这个缓存)
"tokenActivityTimeout": -1, // token剩余无操作有效时间 (单位: 秒)
"tokenActiveTimeout": -1, // token 距离被冻结还剩的时间 (单位: 秒)
"loginDevice": "default-device" // 登录设备类型
},
}

View File

@@ -2,7 +2,7 @@
<!-- 本篇介绍Token有效期的详细用法 -->
Sa-Token 提供两种 Token 自动过期策略,分别是 `timeout``activity-timeout`,配置方法如下:
Sa-Token 提供两种 Token 自动过期策略,分别是 `timeout``active-timeout`,配置方法如下:
<!---------------------------- tabs:start ---------------------------->
<!------------- tab:yaml 风格 ------------->
@@ -11,14 +11,14 @@ sa-token:
# token 有效期单位默认30天-1代表永不过期
timeout: 2592000
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
activity-timeout: -1
active-timeout: -1
```
<!------------- tab:properties 风格 ------------->
``` properties
# token 有效期单位默认30天-1代表永不过期
sa-token.timeout=2592000
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
sa-token.activity-timeout=-1
sa-token.active-timeout=-1
```
<!---------------------------- tabs:end ---------------------------->
@@ -29,7 +29,7 @@ sa-token.activity-timeout=-1
> 2. 银行为你颁发一张储蓄卡系统为你颁发一个Token以后每次存取钱都要带上这张卡后续每次访问系统都要提交 Token
> 3. 银行为这张卡设定两个过期时间:
> - 第一个是 `timeout`,代表这张卡的长久有效期,就是指这张卡最长能用多久,假设 `timeout=3年`那么3年后此卡将被银行删除想要继续来银行办理业务必须重新办卡Token 过期后想要访问系统必须重新登录)。
> - 第二个就是 `activity-timeout`,代表这张卡的最低活跃频率限制,就是指这张卡必须每隔多久来银行一次,假设 `activity-timeout=1月` 你如果超过1月不来办一次业务银行就将你的卡冻结列为长期不动户Token 长期不访问系统,被冻结,但不会被删除)。
> - 第二个就是 `active-timeout`,代表这张卡的最低活跃频率限制,就是指这张卡必须每隔多久来银行一次,假设 `active-timeout=1月` 你如果超过1月不来办一次业务银行就将你的卡冻结列为长期不动户Token 长期不访问系统,被冻结,但不会被删除)。
> 4. 两个过期策略可以单独配置也可以同时配置只要有其中一个有效期超出了范围这张卡就会变得不可用两个有效期只要有一个过期了Token就无法成功访问系统了
下面是对两个过期策略的详细解释:
@@ -40,33 +40,33 @@ sa-token.activity-timeout=-1
3. `timeout`的值配置为-1后代表永久有效不会过期。
### activity-timeout
1. `activity-timeout`代表最低活跃频率,单位/秒,例如将其配置为 1800 (30分钟)代表用户如果30分钟无操作则此Token会立即过期被冻结但不会删除掉
### active-timeout
1. `active-timeout`代表最低活跃频率,单位/秒,例如将其配置为 1800 (30分钟)代表用户如果30分钟无操作则此Token会立即过期被冻结但不会删除掉
2. 如果在30分钟内用户有操作则会再次续签30分钟用户如果一直操作则会一直续签直到连续30分钟无操作Token才会过期。
3. `activity-timeout`的值配置为-1后代表永久有效不会过期此时也无需频繁续签。
3. `active-timeout`的值配置为-1后代表永久有效不会过期此时也无需频繁续签。
### 关于activity-timeout的续签
如果`activity-timeout`配置了大于零的值Sa-Token 会在登录时开始计时,在每次直接或间接调用`getLoginId()`时进行一次冻结检查与续签操作。
### 关于active-timeout的续签
如果`active-timeout`配置了大于零的值Sa-Token 会在登录时开始计时,在每次直接或间接调用`getLoginId()`时进行一次冻结检查与续签操作。
此时会有两种情况:
1. 一种是会话无操作时间太长Token已经被冻结此时框架会抛出`NotLoginException`异常(场景值=-3)
2. 另一种则是会话在`activity-timeout`有效期内通过检查此时Token可以成功续签
2. 另一种则是会话在`active-timeout`有效期内通过检查此时Token可以成功续签
### 我可以手动续签 activity-timeout 吗?
### 我可以手动续签 active-timeout 吗?
**可以!**
如果框架的自动续签算法无法满足您的业务需求你可以进行手动续签Sa-Token 提供两个API供你操作
1. `StpUtil.checkActivityTimeout()`: 检查当前Token 是否已经被冻结,如果是则抛出异常
2. `StpUtil.updateLastActivityToNow()`: 续签当前Token(将 [最后操作时间] 更新为当前时间戳)
1. `StpUtil.checkActiveTimeout()`: 检查当前Token 是否已经被冻结,如果是则抛出异常
2. `StpUtil.updateLastActiveToNow()`: 续签当前Token(将 [最后操作时间] 更新为当前时间戳)
注意:在手动续签时,即使 Token 已经被冻结也可续签成功解冻如果此场景下需要提示续签失败可采用先检查再续签的形式保证Token有效性
例如以下代码:
``` java
// 先检查是否已被冻结
StpUtil.checkActivityTimeout();
StpUtil.checkActiveTimeout();
// 检查通过后继续续签
StpUtil.updateLastActivityToNow();
StpUtil.updateLastActiveToNow();
```
同时,你还可以关闭框架的自动续签(在配置文件中配置 `autoRenew=false` ),此时续签操作完全由开发者控制,框架不再自动进行任何续签操作
@@ -75,16 +75,16 @@ StpUtil.updateLastActivityToNow();
``` java
// 为指定 Token 续签
StpUtil.stpLogic.updateLastActivityToNow(tokenValue);
StpUtil.stpLogic.updateLastActiveToNow(tokenValue);
```
### timeout 与 activity-timeout 可以同时使用吗?
### timeout 与 active-timeout 可以同时使用吗?
**可以同时使用!**
两者的认证逻辑彼此独立,互不干扰,可以同时使用。
### StpUtil 类中哪些公开方法支持临时有效期自动续签 activity-timeout?
### StpUtil 类中哪些公开方法支持自动续签 active-timeout?
> 直接或间接获取了当前用户id的方法 (间接调用过 StpLogic.getLoginId() 方法)
| 包括但不限于这些: |

View File

@@ -73,18 +73,20 @@ SaFoxUtil.toList(... strs); // String 数组转集合
1、首先在项目根目录创建一个配置文件`sa-token.properties`
``` java
# token名称 (同时也是cookie名称)
``` properties
# token 名称 (同时也是 cookie 名称)
tokenName=satoken
# token有效期单位s 默认30天, -1代表永不过期
# token 有效期单位:秒) 默认30天-1 代表永久有效
timeout=2592000
# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
activityTimeout=-1
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) =-1
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
activeTimeout=-1
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录
isConcurrent=true
# 在多人登录同一账号时是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token
isShare=true
# token风格
# token 风格默认可取值uuid、simple-uuid、random-32、random-64、random-128、tik
tokenStyle=uuid
# 是否输出操作日志
isLog=false
```

View File

@@ -88,7 +88,7 @@ Sa-Token 的部分 API 只能在 Web 上下文中才能调用,例如:`StpUti
- 可能9可能是多账号鉴权的关系在多账号模式下如果是 `StpUserUtil.login()` 颁发的token你从 `StpUtil.checkLogin()` 进行校验永远都是无效token因为账号体系没对上。
**如果是Token已过期6ad93254-b286-4ec9-9997-4430b0341ca0**
- 可能1前端提交的 token 临时过期activity-timeout超时了比如配置了 activity-timeout=120但是超过了120秒没有访问接口
- 可能1前端提交的 token 已被冻结active-timeout超时了比如配置了 active-timeout=120但是超过了120秒没有访问接口
- 可能2集成jwt而且使用的是 Mixin 或 Stateless 模式而且token过期了timeout超时了
**如果是Token已被顶下线6ad93254-b286-4ec9-9997-4430b0341ca0**

View File

@@ -18,7 +18,7 @@ Sa-Token 无意发明任何晦涩概念提升逼格,但在处理 issue 、Q群
#### 两种过期时间:
- timeout会话 Token 的长久有效期。
- activity-timeout会话的临时有效期
- active-timeout会话 Token 的最低活跃频率
两者的差别详见:[Token有效期详解](/fun/token-timeout)

View File

@@ -150,7 +150,7 @@ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbklkIjoiMTAwMDEiLCJybiI6IjZYYzgySzB
| 角色认证 | 支持 | 支持 | 支持 |
| 权限认证 | 支持 | 支持 | 支持 |
| timeout 有效期 | 支持 | 支持 | 支持 |
| activity-timeout 有效期 | 支持 | 支持 | 不支持 |
| active-timeout 有效期 | 支持 | 支持 | 不支持 |
| id反查Token | 支持 | 支持 | 不支持 |
| 会话管理 | 支持 | 部分支持 | 不支持 |
| 注解鉴权 | 支持 | 支持 | 支持 |

View File

@@ -57,18 +57,18 @@ server:
sa-token:
# token 名称(同时也是 cookie 名称)
token-name: satoken
# token 有效期(单位:秒)默认30天-1代表永不过期
# token 有效期(单位:秒) 默认30天-1 代表永久有效
timeout: 2592000
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
activity-timeout: -1
# 是否允许同一账号多地同时登录(为 true 时允许一起登录为 false 时新登录挤掉旧登录)
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
active-timeout: -1
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token为 false 时每次登录新建一个 token
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token
is-share: true
# token 风格
# token 风格默认可取值uuid、simple-uuid、random-32、random-64、random-128、tik
token-style: uuid
# 是否输出操作日志
is-log: false
# 是否输出操作日志
is-log: true
```
<!------------- tab:application.properties 风格 ------------->
@@ -78,20 +78,20 @@ server.port=8081
############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
# token名称同时也是 cookie 名称)
# token 名称(同时也是 cookie 名称)
sa-token.token-name=satoken
# token 有效期(单位:秒)默认30天-1代表永不过期
# token 有效期(单位:秒) 默认30天-1 代表永久有效
sa-token.timeout=2592000
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
sa-token.activity-timeout=-1
# 是否允许同一账号多地同时登录(为 true 时允许一起登录为 false 时新登录挤掉旧登录)
sa-token.active-timeout=-1
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
sa-token.is-concurrent=true
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token为 false 时每次登录新建一个 token
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token
sa-token.is-share=true
# token 风格
# token 风格默认可取值uuid、simple-uuid、random-32、random-64、random-128、tik
sa-token.token-style=uuid
# 是否输出操作日志
sa-token.is-log=false
sa-token.is-log=true
```
<!---------------------------- tabs:end ---------------------------->

View File

@@ -68,18 +68,18 @@ server:
sa-token:
# token 名称(同时也是 cookie 名称)
token-name: satoken
# token 有效期(单位:秒)默认30天-1代表永不过期
# token 有效期(单位:秒) 默认30天-1 代表永久有效
timeout: 2592000
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
activity-timeout: -1
# 是否允许同一账号多地同时登录(为 true 时允许一起登录为 false 时新登录挤掉旧登录)
active-timeout: -1
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token为 false 时每次登录新建一个 token
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token
is-share: true
# token 风格
# token 风格默认可取值uuid、simple-uuid、random-32、random-64、random-128、tik
token-style: uuid
# 是否输出操作日志
is-log: false
is-log: true
```
<!------------- tab:app.properties 风格 ------------->
@@ -89,20 +89,20 @@ server.port=8081
############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
# token名称同时也是 cookie 名称)
# token 名称(同时也是 cookie 名称)
sa-token.token-name=satoken
# token 有效期(单位:秒)默认30天-1代表永不过期
# token 有效期(单位:秒) 默认30天-1 代表永久有效
sa-token.timeout=2592000
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
sa-token.activity-timeout=-1
# 是否允许同一账号多地同时登录(为 true 时允许一起登录为 false 时新登录挤掉旧登录)
sa-token.active-timeout=-1
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
sa-token.is-concurrent=true
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token为 false 时每次登录新建一个 token
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token
sa-token.is-share=true
# token 风格
# token 风格默认可取值uuid、simple-uuid、random-32、random-64、random-128、tik
sa-token.token-style=uuid
# 是否输出操作日志
sa-token.is-log=false
sa-token.is-log=true
```
<!---------------------------- tabs:end ---------------------------->

View File

@@ -14,38 +14,38 @@
sa-token:
# token 名称(同时也是 cookie 名称)
token-name: satoken
# token 有效期(单位:秒)默认30天-1代表永不过期
# token 有效期(单位:秒) 默认30天-1 代表永久有效
timeout: 2592000
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
activity-timeout: -1
# 是否允许同一账号多地同时登录(为 true 时允许一起登录为 false 时新登录挤掉旧登录)
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
active-timeout: -1
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token为 false 时每次登录新建一个 token
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token
is-share: true
# token 风格
# token 风格默认可取值uuid、simple-uuid、random-32、random-64、random-128、tik
token-style: uuid
# 是否输出操作日志
is-log: false
# 是否输出操作日志
is-log: true
```
<!------------- tab:properties 风格 ------------->
``` properties
############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
# token名称同时也是 cookie 名称)
# token 名称(同时也是 cookie 名称)
sa-token.token-name=satoken
# token 有效期(单位:秒)默认30天-1代表永不过期
# token 有效期(单位:秒) 默认30天-1 代表永久有效
sa-token.timeout=2592000
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
sa-token.activity-timeout=-1
# 是否允许同一账号多地同时登录(为 true 时允许一起登录为 false 时新登录挤掉旧登录)
sa-token.active-timeout=-1
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
sa-token.is-concurrent=true
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token为 false 时每次登录新建一个 token
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token
sa-token.is-share=true
# token 风格
# token 风格默认可取值uuid、simple-uuid、random-32、random-64、random-128、tik
sa-token.token-style=uuid
# 是否输出操作日志
sa-token.is-log=false
sa-token.is-log=true
```
<!---------------------------- tabs:end ---------------------------->
@@ -70,7 +70,7 @@ public class SaTokenConfigure {
SaTokenConfig config = new SaTokenConfig();
config.setTokenName("satoken"); // token 名称(同时也是 cookie 名称)
config.setTimeout(30 * 24 * 60 * 60); // token 有效期单位默认30天-1代表永不过期
config.setActivityTimeout(-1); // token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
config.setActiveTimeout(-1); // token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
config.setIsConcurrent(true); // 是否允许同一账号多地同时登录(为 true 时允许一起登录,为 false 时新登录挤掉旧登录)
config.setIsShare(true); // 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token为 false 时每次登录新建一个 token
config.setTokenStyle("uuid"); // token 风格
@@ -92,7 +92,7 @@ public class SaTokenConfigure {
public void configSaToken(SaTokenConfig config) {
config.setTokenName("satoken"); // token 名称(同时也是 cookie 名称)
config.setTimeout(30 * 24 * 60 * 60); // token 有效期单位默认30天-1代表永不过期
config.setActivityTimeout(-1); // token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
config.setActiveTimeout(-1); // token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
config.setIsConcurrent(true); // 是否允许同一账号多地同时登录(为 true 时允许一起登录,为 false 时新登录挤掉旧登录)
config.setIsShare(true); // 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token为 false 时每次登录新建一个 token
config.setTokenStyle("uuid"); // token 风格
@@ -116,7 +116,7 @@ public class SaTokenConfigure {
| :-------- | :-------- | :-------- | :-------- |
| tokenName | String | satoken | Token 名称 (同时也是 Cookie 名称、数据持久化前缀) |
| timeout | long | 2592000 | Token 有效期单位默认30天-1代表永不过期 [参考token有效期详解](/fun/token-timeout) |
| activityTimeout | long | -1 | Token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制永不冻结例如可以设置为1800代表30分钟内无操作就过期 [参考token有效期详解](/fun/token-timeout) |
| activeTimeout | long | -1 | Token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制永不冻结例如可以设置为1800代表30分钟内无操作就冻结 [参考token有效期详解](/fun/token-timeout) |
| isConcurrent | Boolean | true | 是否允许同一账号并发登录 (为 true 时允许一起登录,为 false 时新登录挤掉旧登录) |
| isShare | Boolean | true | 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token为 false 时每次登录新建一个 token |
| maxLoginCount | int | 12 | 同一账号最大登录数量,-1代表不限 (只有在 `isConcurrent=true``isShare=false` 时此配置才有效),[详解](/use/config?id=配置项详解maxlogincount) |