mirror of
https://gitee.com/dromara/sa-token.git
synced 2026-05-14 04:42:09 +08:00
docs: 补全数据结构说明
This commit is contained in:
@@ -115,7 +115,7 @@
|
||||
|
||||
- **框架设计**
|
||||
- [仓库目录](/arch/dir-intro)
|
||||
|
||||
- [数据结构](/arch/data-structure)
|
||||
|
||||
|
||||
- **其它**
|
||||
@@ -140,7 +140,6 @@
|
||||
- [数据读写三大作用域](/fun/three-scope)
|
||||
- [TokenInfo参数详解](/fun/token-info)
|
||||
- [异常细分状态码](/fun/exception-code)
|
||||
- [数据结构](/fun/data-structure)
|
||||
- [自定义注解](/fun/custom-annotations)
|
||||
- [防火墙](/fun/firewall)
|
||||
- [参考:把权限放在缓存里](/fun/jur-cache)
|
||||
|
||||
@@ -6,24 +6,20 @@
|
||||
### 1.1、token -> loginId 映射
|
||||
|
||||
``` js
|
||||
{tokenName}:{loginType}:token:{tokenValue}
|
||||
// ttl = 此 token 的 timeout 有效期
|
||||
{tokenName}:{loginType}:token:{tokenValue} --> {loginId}
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>详细</summary>
|
||||
|
||||
key 示例 (ttl 为 timeout 有效期值 )
|
||||
示例:
|
||||
``` js
|
||||
satoken:login:token:47ab0105-2be1-400c-b517-82f81a0cfcf8
|
||||
```
|
||||
|
||||
|
||||
正常 value 格式
|
||||
``` js
|
||||
10001 loginId,登录id,一般为账号id
|
||||
satoken:login:token:47ab0105-2be1-400c-b517-82f81a0cfcf8 --> 10001
|
||||
```
|
||||
|
||||
异常 value 格式
|
||||
|
||||
``` js
|
||||
-1 未能从请求中读取到有效 token
|
||||
-2 已读取到 token,但是 token 无效
|
||||
@@ -40,28 +36,27 @@ satoken:login:token:47ab0105-2be1-400c-b517-82f81a0cfcf8
|
||||
### 1.2、active-timeout
|
||||
|
||||
``` js
|
||||
{tokenName}:{loginType}:last-active:{tokenValue}
|
||||
// ttl = 对应 token 的 timeout 有效期值
|
||||
{tokenName}:{loginType}:last-active:{tokenValue} --> {13位时间戳}
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>详细</summary>
|
||||
|
||||
key 示例 (key 的 ttl 为 timeout 有效期值 )
|
||||
示例:
|
||||
``` js
|
||||
satoken:login:last-active:06d1f12b-614e-4c00-8d8e-c07fef5f4aa9
|
||||
satoken:login:last-active:06d1f12b-614e-4c00-8d8e-c07fef5f4aa9 --> 1722334954193
|
||||
```
|
||||
|
||||
value 格式
|
||||
value 格式分两种:
|
||||
```
|
||||
1722334954193 // 单值时:此 token 最后访问日期
|
||||
1722334954193, 1200 // 双值时:此 token 最后访问日期,此 token 指定的动态 active-timeout 值
|
||||
```
|
||||
|
||||
active-timeout 判断方式:
|
||||
注意:判断一个 token 是否 active-timeout 过期,与 ttl 无关,而是利 value 值计算:
|
||||
``` js
|
||||
当前时间 - token 最后访问时间 > active-timeout
|
||||
返回 true: 此 token 已冻结
|
||||
返回 false:此 token 未冻结
|
||||
当前时间 - token 最后访问时间 > active-timeout (true=token 已冻结,false=token 未冻结 )
|
||||
```
|
||||
|
||||
</details>
|
||||
@@ -71,9 +66,9 @@ active-timeout 判断方式:
|
||||
### 1.3、SaSession
|
||||
|
||||
``` js
|
||||
{tokenName}:{loginType}:session:{loginId} // Account-Session
|
||||
{tokenName}:{loginType}:token-session:{loginId} // Token-Session
|
||||
{tokenName}:custom:session:{sessionId} // Custom-Session
|
||||
{tokenName}:{loginType}:session:{loginId} --> {SaSession 对象} // Account-Session
|
||||
{tokenName}:{loginType}:token-session:{loginId} --> {SaSession 对象} // Token-Session
|
||||
{tokenName}:custom:session:{sessionId} --> {SaSession 对象} // Custom-Session
|
||||
```
|
||||
|
||||
<details>
|
||||
@@ -139,14 +134,14 @@ value 格式
|
||||
|
||||
### 1.4、二级认证
|
||||
``` js
|
||||
{tokenName}:{loginType}:safe:{service}:{tokenValue}
|
||||
{tokenName}:{loginType}:safe:{service}:{tokenValue} --> SAFE_AUTH_SAVE_VALUE
|
||||
```
|
||||
value 为常亮值:`SAFE_AUTH_SAVE_VALUE`
|
||||
|
||||
|
||||
### 1.5、账号服务封禁
|
||||
``` js
|
||||
{tokenName}:{loginType}:disable:{service}:{loginId}
|
||||
{tokenName}:{loginType}:disable:{service}:{loginId} --> {level}
|
||||
```
|
||||
value 为封禁等级,int类型
|
||||
|
||||
@@ -157,19 +152,19 @@ SaApplication 全局变量
|
||||
{tokenName}:var:{变量名}
|
||||
```
|
||||
|
||||
本次请求新创建 token,存储 key
|
||||
本次请求新创建 token,在 SaStorage 存储 key
|
||||
``` js
|
||||
JUST_CREATED_
|
||||
JUST_CREATED_ --> {token}
|
||||
```
|
||||
|
||||
本次请求新创建 token,存储 key (无前缀方式)
|
||||
本次请求新创建 token,在 SaStorage 存储 key (无前缀方式)
|
||||
``` js
|
||||
JUST_CREATED_NOT_PREFIX_
|
||||
JUST_CREATED_NOT_PREFIX_ --> {token}
|
||||
```
|
||||
|
||||
临时身份切换,使用的key
|
||||
``` js
|
||||
SWITCH_TO_SAVE_KEY_{loginType}
|
||||
SWITCH_TO_SAVE_KEY_{loginType} --> {loginId}
|
||||
```
|
||||
|
||||
|
||||
@@ -177,23 +172,19 @@ SWITCH_TO_SAVE_KEY_{loginType}
|
||||
|
||||
### 2.1、ticket -> loginId 映射
|
||||
``` js
|
||||
{tokenName}:ticket:{ticket}
|
||||
// ttl = 此 ticket 有效期,下同理
|
||||
{tokenName}:ticket:{ticket} --> {loginId}
|
||||
```
|
||||
值为 loginId
|
||||
|
||||
|
||||
### 2.2、ticket -> client 映射
|
||||
``` js
|
||||
{tokenName}:ticket-client:{ticket}
|
||||
{tokenName}:ticket-client:{ticket} --> {client}
|
||||
```
|
||||
值为 client
|
||||
|
||||
|
||||
### 2.3、loginId -> ticket 映射(loginId 反查 ticket)
|
||||
### 2.3、loginId -> ticket 映射(client + loginId 反查 ticket)
|
||||
``` js
|
||||
{tokenName}:id-ticket:{id}
|
||||
{tokenName}:ticket-index:{client}:{loginId} --> {ticket}
|
||||
```
|
||||
值为 ticket
|
||||
|
||||
|
||||
|
||||
@@ -201,21 +192,21 @@ SWITCH_TO_SAVE_KEY_{loginType}
|
||||
|
||||
### 3.1、Code 授权码
|
||||
``` js
|
||||
{tokenName}:oauth2:code:{code}
|
||||
{tokenName}:oauth2:code:{code} --> {CodeModel 对象}
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>详细</summary>
|
||||
|
||||
值为 CodeModel
|
||||
value 示例:
|
||||
|
||||
``` js
|
||||
{
|
||||
"@class": "cn.dev33.satoken.oauth2.model.CodeModel", // java class 信息
|
||||
"code": "AbRVp2HrgyklE0BXYWszskGJWAGY7xhGu6Zaco4zJECzGYagCCFWj0jOlHza", // code值
|
||||
"scope": "", // 所申请权限列表,多个用逗号隔开
|
||||
"loginId": "10001", // 对应的loginId
|
||||
"redirectUri": "", // 重定向地址
|
||||
"@class": "cn.dev33.satoken.oauth2.model.CodeModel", // java class 信息
|
||||
"code": "AbRVp2HrgyklE0BXYWszskGJWAGY7xhGu6Zaco4zJECzGYagCCFWj0jOlHza", // code值
|
||||
"scope": "", // 所申请权限列表,多个用逗号隔开
|
||||
"loginId": "10001", // 对应的loginId
|
||||
"redirectUri": "", // 重定向地址
|
||||
}
|
||||
```
|
||||
|
||||
@@ -223,20 +214,20 @@ SWITCH_TO_SAVE_KEY_{loginType}
|
||||
|
||||
clientId + loginId 反查 code
|
||||
``` js
|
||||
{tokenName}:oauth2:code-index:{clientId}:{loginId}
|
||||
{tokenName}:oauth2:code-index:{clientId}:{loginId} --> {code 值}
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 3.2、Access-Token 资源令牌
|
||||
``` js
|
||||
{tokenName}:oauth2:access-token:{accessToken}
|
||||
{tokenName}:oauth2:access-token:{accessToken} --> {AccessTokenModel 对象}
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>详细</summary>
|
||||
|
||||
值为 AccessTokenModel
|
||||
value 示例:
|
||||
|
||||
``` js
|
||||
{
|
||||
@@ -277,19 +268,19 @@ clientId + loginId 反查 code
|
||||
|
||||
clientId + loginId 反查 Access-Token
|
||||
``` js
|
||||
{tokenName}:oauth2:access-token-index:{clientId}:{loginId}
|
||||
{tokenName}:oauth2:access-token-index:{clientId}:{loginId} --> {access_token 值}
|
||||
```
|
||||
|
||||
|
||||
### 3.3、Refresh-Token 资源令牌
|
||||
``` js
|
||||
{tokenName}:oauth2:refresh-token:{refreshToken}
|
||||
{tokenName}:oauth2:refresh-token:{refreshToken} --> {RefreshTokenModel 对象}
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>详细</summary>
|
||||
|
||||
值为 RefreshTokenModel
|
||||
value 示例:
|
||||
|
||||
``` js
|
||||
{
|
||||
@@ -324,19 +315,19 @@ clientId + loginId 反查 Access-Token
|
||||
|
||||
clientId + loginId 反查 Refresh-Token
|
||||
``` js
|
||||
{tokenName}:oauth2:refresh-token-index:{clientId}:{loginId}
|
||||
{tokenName}:oauth2:refresh-token-index:{clientId}:{loginId} --> {refresh_token 值}
|
||||
```
|
||||
|
||||
|
||||
### 3.4、Client-Token 应用令牌
|
||||
``` js
|
||||
{tokenName}:oauth2:client-token:{clientToken}
|
||||
{tokenName}:oauth2:client-token:{clientToken} --> {ClientTokenModel 对象}
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>详细</summary>
|
||||
|
||||
值为 ClientTokenModel
|
||||
value 示例:
|
||||
|
||||
``` js
|
||||
{
|
||||
@@ -368,19 +359,19 @@ clientId + loginId 反查 Refresh-Token
|
||||
|
||||
clientId 反查 Client-Token
|
||||
``` js
|
||||
{tokenName}:oauth2:client-token-index:{clientId}
|
||||
{tokenName}:oauth2:client-token-index:{clientId} --> {client_token 值}
|
||||
```
|
||||
|
||||
Lower-Client-Token 次级应用令牌索引
|
||||
``` js
|
||||
{tokenName}:oauth2:lower-client-token-index:{clientId}
|
||||
{tokenName}:oauth2:lower-client-token-index:{clientId} --> {client_token 值}
|
||||
```
|
||||
|
||||
### 3.5、用户授权记录
|
||||
``` js
|
||||
{tokenName}:oauth2:grant-scope:{clientId}:{loginId}
|
||||
{tokenName}:oauth2:grant-scope:{clientId}:{loginId} --> {scope列表}
|
||||
```
|
||||
值为 scope 列表,多个用逗号隔开
|
||||
值为 scope 列表,多个用逗号隔开,例如:`userinfo,openid,userid`。
|
||||
|
||||
|
||||
|
||||
@@ -388,21 +379,35 @@ Lower-Client-Token 次级应用令牌索引
|
||||
## 4、插件
|
||||
|
||||
### 4.1、临时 token 会话
|
||||
|
||||
temp-token -> value
|
||||
|
||||
``` js
|
||||
{tokenName}:temp-token:{service}:{token}
|
||||
// namespace 默认值为 "temp-token"
|
||||
{tokenName}:{namespace}:{temp-token} --> {value}
|
||||
```
|
||||
|
||||
value 反查 temp-token
|
||||
|
||||
``` js
|
||||
{tokenName}:raw-session:{namespace}:{value} --> {Raw#SaSession 对象}
|
||||
```
|
||||
|
||||
- 在 SaSession 以 `__HD_TEMP_TOKEN_MAP` 为 key 存储 temp-token 索引列表。值类型为 Map。
|
||||
- 其中:Map 的 key = temp-token 值,Map 的 value = 此 temp-token 到期时间戳。
|
||||
|
||||
|
||||
|
||||
### 4.2、 Same-Token
|
||||
|
||||
Same-Token
|
||||
``` js
|
||||
{tokenName}:var:same-token
|
||||
{tokenName}:var:same-token --> {same-token 值}
|
||||
```
|
||||
|
||||
Past-Same-Token
|
||||
``` js
|
||||
{tokenName}:var:past-same-token
|
||||
{tokenName}:var:past-same-token --> {same-token 值}
|
||||
```
|
||||
|
||||
|
||||
@@ -410,9 +415,59 @@ Past-Same-Token
|
||||
|
||||
随机字符串
|
||||
``` js
|
||||
{tokenName}:sign:nonce:{32位随机字符}
|
||||
// nonce 值 默认为 32位随机字符
|
||||
{tokenName}:sign:nonce:{nonce} --> {nonce 值}
|
||||
```
|
||||
|
||||
### 4.4、API Key
|
||||
|
||||
``` js
|
||||
// namespace 默认值为 "apikey" (全小写), ttl = 此 API Key 剩余有效期
|
||||
{tokenName}:{namespace}:{apikey} --> {ApiKeyModel 对象}
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>详细</summary>
|
||||
|
||||
key 示例:
|
||||
|
||||
``` js
|
||||
satoken:apikey:AK-XCoJLP2E7Q9GXyPiiZWMM8Sqi6Fm0JoFC41R
|
||||
```
|
||||
|
||||
value 示例:
|
||||
``` js
|
||||
{
|
||||
"@class": "cn.dev33.satoken.apikey.model.ApiKeyModel", // java class 信息
|
||||
"title": "test", // API Key 名称
|
||||
"intro": null, // 用途介绍
|
||||
"apiKey": "AK-XCoJLP2E7Q9GXyPiiZWMM8Sqi6Fm0JoFC41R", // API Key 值
|
||||
"loginId": "10001", // 所属用户 id
|
||||
"createTime": 1766509019137, // 创建时间戳
|
||||
"expiresTime": 1769101019136, // 到期时间戳
|
||||
"isValid": true, // 是否有效
|
||||
"scopes": [ // 含有权限
|
||||
"java.util.ArrayList",
|
||||
[
|
||||
"userinfo",
|
||||
"user-update"
|
||||
]
|
||||
],
|
||||
"extraData": null // 扩展数据:Map<String, Object> 类型
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
value 反查 API Key
|
||||
|
||||
``` js
|
||||
{tokenName}:raw-session:{namespace}:{value} --> {Raw#SaSession 对象}
|
||||
```
|
||||
|
||||
- 在 SaSession 以 `__HD_API_KEY_LIST` 为 key 存储 API Key 索引列表。值类型为 List (API Key 列表)。
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,29 @@
|
||||
# 仓库目录介绍
|
||||
|
||||
仓库目录介绍:
|
||||
---
|
||||
|
||||
### 1、仓库根目录介绍:
|
||||
|
||||
``` js
|
||||
── sa-token
|
||||
├── sa-token-core // [核心] Sa-Token 核心模块
|
||||
├── sa-token-dependencies // [依赖] Sa-Token 依赖版本信息
|
||||
├── sa-token-bom // [核心] Sa-Token bom 包
|
||||
├── sa-token-starter // [整合] Sa-Token 与其它框架整合
|
||||
├── sa-token-plugin // [插件] Sa-Token 插件合集
|
||||
├── sa-token-demo // [示例] Sa-Token 示例合集
|
||||
├── sa-token-test // [测试] Sa-Token 单元测试合集
|
||||
├── sa-token-doc // [文档] Sa-Token 开发文档
|
||||
├── pom.xml // [依赖] 顶级pom文件
|
||||
├── LICENSE // 开源协议
|
||||
├── mvn clean.bat // 一键 mvn clean 核心包+所有示例包
|
||||
├── mvn test.bat // 一键单元测试
|
||||
├── preview-doc.bat // 一键预览开发文档
|
||||
├── README.md // 仓库自述文件
|
||||
```
|
||||
|
||||
|
||||
### 2、所有目录详细介绍:
|
||||
|
||||
``` js
|
||||
── sa-token
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
### Sa-Token 功能结构图:
|
||||
|
||||

|
||||

|
||||
|
||||
### Sa-Token 认证流程图:
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ Sa-Token提供两种解决方案:
|
||||
|
||||
本篇主要讲解方案二 `Same-Token` 模块的整合步骤,其鉴权流程与 OAuth2.0 类似,不过使用方式上更加简洁(希望使用方案一的同学可参考Sa-OAuth2模块,此处不再赘述)
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 二、网关转发鉴权
|
||||
@@ -206,7 +206,9 @@ Same-Token —— 专门解决同源系统互相调用时的身份认证校验
|
||||
|
||||
基本使用流程为:服务调用方获取 Same-Token,提交到请求中,被调用方取出 Same-Token 进行校验:如果一致则校验通过,否则拒绝服务。
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
首先我们预览一下此模块的相关API:
|
||||
|
||||
@@ -252,6 +252,13 @@ body{
|
||||
[title=s-w-sh]{display: inline-block; border: 1px #eee solid;}
|
||||
[title=w-100]{display: inline-block; border: 1px #eee solid; max-width: 100%;}
|
||||
|
||||
/* 鼠标悬浮时切换img */
|
||||
.hover-change-img {border: 1px #eee solid; max-width: 100%; }
|
||||
.hover-change-img:hover img:first-child{ display: none; }
|
||||
.hover-change-img img:last-child{ display: none; }
|
||||
.hover-change-img img:first-child{ display: inline-block; }
|
||||
.hover-change-img:hover img:last-child{ display: inline-block; }
|
||||
|
||||
/* 公众号table */
|
||||
.gzh-table{ /* table-layout:fixed !important; */}
|
||||
/* .gzh-table,.gzh-table tr,.gzh-table td{display: block !important;} */
|
||||
|
||||
Reference in New Issue
Block a user