docs: 补全数据结构说明

This commit is contained in:
click33
2025-12-24 01:14:50 +08:00
parent 2cf899e019
commit f4fa77edd0
6 changed files with 152 additions and 66 deletions

View File

@@ -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)

View File

@@ -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 列表)。

View File

@@ -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

View File

@@ -4,7 +4,7 @@
### Sa-Token 功能结构图:
![sa-token-rz](https://oss.dev33.cn/sa-token/art/sa-token-js4.png 's-w')
![sa-token-rz](https://oss.dev33.cn/sa-token/art/sa-token-js4--2.png 's-w')
### Sa-Token 认证流程图:

View File

@@ -18,7 +18,7 @@ Sa-Token提供两种解决方案
本篇主要讲解方案二 `Same-Token` 模块的整合步骤,其鉴权流程与 OAuth2.0 类似不过使用方式上更加简洁希望使用方案一的同学可参考Sa-OAuth2模块此处不再赘述
![子服务外网隔离.drawio.svg](https://oss.dev33.cn/sa-token/doc/micro/子服务外网隔离.drawio.svg 'w-100')
![Same-Token_同源系统认证---带动画.drawio.svg](https://oss.dev33.cn/sa-token/doc/micro/子服务外网隔离---带动画.drawio.svg 'w-100')
### 二、网关转发鉴权
@@ -206,7 +206,9 @@ Same-Token —— 专门解决同源系统互相调用时的身份认证校验
基本使用流程为:服务调用方获取 Same-Token提交到请求中被调用方取出 Same-Token 进行校验:如果一致则校验通过,否则拒绝服务。
![Same-Token_同源系统认证.drawio.svg](https://oss.dev33.cn/sa-token/doc/micro/Same-Token_同源系统认证.drawio.svg 'w-100')
![Same-Token_同源系统认证---带动画.drawio.svg](https://oss.dev33.cn/sa-token/doc/micro/Same-Token_同源系统认证---带动画.drawio.svg 'w-100')
首先我们预览一下此模块的相关API

View File

@@ -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;} */