diff --git a/sa-token-doc/_sidebar.md b/sa-token-doc/_sidebar.md index c75611db..33726fd6 100644 --- a/sa-token-doc/_sidebar.md +++ b/sa-token-doc/_sidebar.md @@ -107,6 +107,7 @@ - [数据读写三大作用域](/fun/three-scope) - [TokenInfo参数详解](/fun/token-info) - [异常细分状态码](/fun/exception-code) + - [数据结构](/fun/data-structure) - [参考:把权限放在缓存里](/fun/jur-cache) - [参考:把路由拦截鉴权动态化](/fun/dynamic-router-check) - [解决反向代理 uri 丢失的问题](/fun/curr-domain) diff --git a/sa-token-doc/fun/data-structure.md b/sa-token-doc/fun/data-structure.md new file mode 100644 index 00000000..a74bafcf --- /dev/null +++ b/sa-token-doc/fun/data-structure.md @@ -0,0 +1,362 @@ +# 数据结构 + + +## 1、登录会话 + +### 1.1、token -> loginId 映射 + +``` js +{tokenName}:{loginType}:token:{tokenValue} +``` + +
+详细 + +key 示例 (ttl 为 timeout 有效期值 ) +``` js +satoken:login:token:47ab0105-2be1-400c-b517-82f81a0cfcf8 +``` + + +正常 value 格式 +``` js +10001 loginId,登录id,一般为账号id +``` + +异常 value 格式 +``` js +-1 未能从请求中读取到有效 token +-2 已读取到 token,但是 token 无效 +-3 已读取到 token,但是 token 已经过期 (详) +-4 已读取到 token,但是 token 已被顶下线 +-5 已读取到 token,但是 token 已被踢下线 +-6 已读取到 token,但是 token 已被冻结 +-7 未按照指定前缀提交 token +``` + +
+ + +### 1.2、active-timeout + +``` js +{tokenName}:{loginType}:last-active:{tokenValue} +``` + +
+详细 + +key 示例 (key 的 ttl 为 timeout 有效期值 ) +``` js +satoken:login:last-active:06d1f12b-614e-4c00-8d8e-c07fef5f4aa9 +``` + +value 格式 +``` +1722334954193 // 单值时:此 token 最后访问日期 +1722334954193, 1200 // 双值时:此 token 最后访问日期,此 token 指定的动态 active-timeout 值 +``` + +active-timeout 判断方式: +``` js +当前时间 - token 最后访问时间 > active-timeout +返回 true: 此 token 已冻结 +返回 false:此 token 未冻结 +``` + +
+ + + +### 1.3、SaSession + +``` js +{tokenName}:{loginType}:session:{loginId} // Account-Session +{tokenName}:{loginType}:token-session:{loginId} // Token-Session +{tokenName}:custom:session:{sessionId} // Custom-Session +``` + +
+详细 + +key 示例 +``` js +// Account-Session +satoken:login:session:1000001 + +// Token-Session +satoken:login:session:47ab0105-2be1-400c-b517-82f81a0cfcf8 + +// Custom-Session +satoken:custom:session:role-1001 +``` + +value 格式 + +``` js +{ + "@class": "cn.dev33.satoken.dao.SaSessionForJacksonCustomized", // java calss 信息 + "id": "satoken:login:session:10001", // sessionId + "type": "Account-Session", // session类型:Account-Session / Token-Session / Custom-Session + "loginType": "login", // 账号类型 + "loginId": [ // 对应登录id 值(Account-Session才会有值) + "java.lang.Long", + 10001 + ], + "token": null, // 对应 token 值 (Token-Session才会有值) + "createTime": 1722334954145, // 此 session 创建时间,13位时间戳 + "dataMap": { // 此 session 挂载数据 + "@class": "java.util.concurrent.ConcurrentHashMap", + "name": "张三" // 此 session 挂载数据 详情 + // 更多值 ... + }, + "tokenSignList": [ // 客户端 token 信息列表(Account-Session才会有值) + "java.util.Vector", + [ + { + "@class": "cn.dev33.satoken.session.TokenSign", + "value": "06d1f12b-614e-4c00-8d8e-c07fef5f4aa9", // 客户端 token 值 + "device": "default-device", // 登录设备 + "tag": null // 挂载自定义值 + } + ] + ] +} +``` + +
+ + +### 1.4、二级认证 +``` js +{tokenName}:{loginType}:safe:{service}:{tokenValue} +``` +value 为常亮值:`SAFE_AUTH_SAVE_VALUE` + + +### 1.5、账号服务封禁 +``` js +{tokenName}:{loginType}:disable:{service}:{loginId} +``` +value 为封禁等级,int类型 + + +### 1.6、其它 +SaApplication 全局变量 +``` js +{tokenName}:var:{变量名} +``` + +本次请求新创建 token,存储 key +``` js +JUST_CREATED_ +``` + +本次请求新创建 token,存储 key (无前缀方式) +``` js +JUST_CREATED_NOT_PREFIX_ +``` + +临时身份切换,使用的key +``` js +SWITCH_TO_SAVE_KEY_{loginType} +``` + + +## 2、SSO 单点登录 + +### 2.1、ticket -> loginId 映射 +``` js +{tokenName}:ticket:{ticket} +``` +值为 loginId + + +### 2.2、ticket -> client 映射 +``` js +{tokenName}:ticket-client:{ticket} +``` +值为 client + + +### 2.3、loginId -> ticket 映射(loginId 反查 ticket) +``` js +{tokenName}:id-ticket:{id} +``` +值为 ticket + + + +## 3、OAuth2 统一认证 + +### 3.1、Code 授权码 +``` js +{tokenName}:oauth2:code:{code} +``` + +
+详细 + +值为 CodeModel + +``` js +{ + "@class": "cn.dev33.satoken.oauth2.model.CodeModel", // java class 信息 + "code": "AbRVp2HrgyklE0BXYWszskGJWAGY7xhGu6Zaco4zJECzGYagCCFWj0jOlHza", // code值 + "scope": "", // 所申请权限列表,多个用逗号隔开 + "loginId": "10001", // 对应的loginId + "redirectUri": "", // 重定向地址 +} +``` + +
+ +clientId + loginId 反查 code +``` js +{tokenName}:oauth2:code-index:{clientId}:{loginId} +``` + + + +### 3.2、Access-Token 资源令牌 +``` js +{tokenName}:oauth2:access-token:{accessToken} +``` + +
+详细 + +值为 AccessTokenModel + +``` js +{ + "@class": "cn.dev33.satoken.oauth2.model.AccessTokenModel", // java class 信息 + "accessToken": "CqRVp2HrgyklE0BXYWszskGJWAGY7xhGu9Zaco4zJECzGYagCCFWj0jOlHoU", // 资源令牌值 + "refreshToken": "EAubykIqRLwbvvi0wfZqnWxoC1bLhPguIfTqX3S1aoTe6pCLKsV9jU3OEI8U", // 刷新令牌值 + "expiresTime": 1722422031510, // 资源令牌到期时间 + "refreshExpiresTime": 1725006831511, // 刷新令牌到期时间 + "clientId": "1001", // 对应的应用id + "loginId": "10001", // 对应的loginId + "openid": "gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__", // 对应的 openid + "scope": "", // 所具有的权限列表,多个用逗号隔开 + "expiresIn": 7199, // 资源令牌剩余有效时间,单位秒 + "refreshExpiresIn": 2592000 // 刷新令牌剩余有效时间,单位秒 +} +``` + +
+ +clientId + loginId 反查 Access-Token +``` js +{tokenName}:oauth2:access-token-index:{clientId}:{loginId} +``` + + +### 3.3、Refresh-Token 资源令牌 +``` js +{tokenName}:oauth2:refresh-token:{refreshToken} +``` + +
+详细 + +值为 RefreshTokenModel + +``` js +{ + "@class": "cn.dev33.satoken.oauth2.model.RefreshTokenModel", // java class 信息 + "refreshToken": "EAubykIqRLwbvvi0wfZqnWxoC1bLhPguIfTqX3S1aoTe6pCLKsV9jU3OEI8U", // 刷新令牌值 + "expiresTime": 1725006831511, // 刷新令牌到期时间 + "clientId": "1001", // 对应的应用id + "scope": "", // 所具有的权限列表,多个用逗号隔开 + "loginId": "10001", // 对应的loginId + "openid": "gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__", // 对应的 openid + "expiresIn": 2591999 // 刷新令牌剩余有效时间,单位秒 +} +``` + +
+ +clientId + loginId 反查 Refresh-Token +``` js +{tokenName}:oauth2:refresh-token-index:{clientId}:{loginId} +``` + + +### 3.4、Client-Token 应用令牌 +``` js +{tokenName}:oauth2:client-token:{clientToken} +``` + +
+详细 + +值为 ClientTokenModel + +``` js +{ + "@class": "cn.dev33.satoken.oauth2.model.ClientTokenModel", // java class 信息 + "clientToken": "fWQjBKxprSslmYFLbzen0oa95rOvqnqYKZW3sD8mzamNbabG8b6MPKPP5uCu", // 应用令牌值 + "expiresTime": 1722425237153, // 应用令牌到期时间 + "clientId": "1001", // 对应的应用id + "scope": null, // 所具有的权限列表,多个用逗号隔开 + "expiresIn": 7200 // 应用令牌剩余有效时间,单位秒 +} +``` + +
+ +clientId 反查 Client-Token +``` js +{tokenName}:oauth2:client-token-index:{clientId} +``` + +Past-Token 次级应用令牌索引 +``` js +{tokenName}:oauth2:past-token-index:{clientId} +``` + +### 3.5、用户授权记录 +``` js +{tokenName}:oauth2:grant-scope:{clientId}:{loginId} +``` +值为 scope 列表,多个用逗号隔开 + + + + +## 4、插件 + +### 4.1、临时 token 会话 +``` js +{tokenName}:temp-token:{service}:{token} +``` + + +### 4.2、 Same-Token + +Same-Token +``` js +{tokenName}:var:same-token +``` + +Past-Same-Token +``` js +{tokenName}:var:past-same-token +``` + + +### 4.3、Sign 签名 + +随机字符串 +``` js +{tokenName}:sign:nonce:{32位随机字符} +``` + + + + + + + + diff --git a/sa-token-doc/static/doc.css b/sa-token-doc/static/doc.css index 0e2362cd..7806a12d 100644 --- a/sa-token-doc/static/doc.css +++ b/sa-token-doc/static/doc.css @@ -409,15 +409,28 @@ body { /* ------------- details标签 ------------- */ .main-box details{ - border: 1px #c4e5b5 solid; + border: 1px #42B983 solid; + background-color: #f4fdef; + overflow: hidden; + max-height: 44px; + /* transition: all 1s; */ +} +.main-box details[open]{ /* max-height: 1000px; */ overflow: auto; animation: slideDown 0.4s linear both;} +@keyframes slideDown { + 0% { max-height: 44px; overflow: hidden; } + 99% { max-height: 1000px; overflow: hidden; } + 100% { max-height: 1000px; overflow: auto; } } .main-box details summary{ padding: 11px 14px; background-color: #f4fdef; color: #01a252; - cursor: pointer; } +.main-box details pre{ + margin-left: 1em; + margin-right: 14px; +} .main-box details p{padding: 0 14px;} /* 广告盒子 */