sa-token/sa-token-doc/doc/use/config.md

255 lines
15 KiB
Markdown
Raw Normal View History

2020-02-06 00:52:49 +08:00
# 框架配置
2021-02-06 15:34:23 +08:00
你可以**零配置启动框架** <br>
2021-06-19 01:38:37 +08:00
但同时你也可以通过配置,定制性使用框架,`Sa-Token`支持多种方式配置框架信息
2020-02-06 00:52:49 +08:00
2021-07-22 04:22:59 +08:00
### 方式1、在 application.yml 配置
2020-02-06 00:52:49 +08:00
``` java
2021-07-22 04:22:59 +08:00
# Sa-Token 配置
2021-07-01 15:15:54 +08:00
sa-token:
# token名称 (同时也是cookie名称)
token-name: satoken
# token有效期单位s 默认30天, -1代表永不过期
timeout: 2592000
# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
activity-timeout: -1
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
2021-07-19 01:12:55 +08:00
is-concurrent: true
2021-07-01 15:15:54 +08:00
# 在多人登录同一账号时是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
2021-07-19 01:12:55 +08:00
is-share: true
2021-07-01 15:15:54 +08:00
# token风格
token-style: uuid
# 是否输出操作日志
is-log: false
2020-02-06 00:52:49 +08:00
```
2021-02-06 15:34:23 +08:00
如果你习惯于 `application.properties` 类型的配置文件,那也很好办: 百度: [springboot properties与yml 配置文件的区别](https://www.baidu.com/s?ie=UTF-8&wd=springboot%20properties%E4%B8%8Eyml%20%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E7%9A%84%E5%8C%BA%E5%88%AB)
2020-02-06 00:52:49 +08:00
2020-12-24 22:51:57 +08:00
### 方式2、通过代码配置
2021-10-11 01:09:28 +08:00
模式1
2020-12-24 22:51:57 +08:00
``` java
2021-02-12 01:57:31 +08:00
/**
2021-06-19 01:38:37 +08:00
* Sa-Token代码方式进行配置
2021-02-12 01:57:31 +08:00
*/
@Configuration
public class SaTokenConfigure {
2021-02-12 01:57:31 +08:00
2021-06-19 01:38:37 +08:00
// 获取配置Bean (以代码的方式配置Sa-Token, 此配置会覆盖yml中的配置)
2021-07-01 15:15:54 +08:00
@Bean
@Primary
public SaTokenConfig getSaTokenConfigPrimary() {
2021-02-12 01:57:31 +08:00
SaTokenConfig config = new SaTokenConfig();
config.setTokenName("satoken"); // token名称 (同时也是cookie名称)
config.setTimeout(30 * 24 * 60 * 60); // token有效期单位s 默认30天
config.setActivityTimeout(-1); // token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
2021-06-16 17:48:21 +08:00
config.setIsConcurrent(true); // 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
2021-02-12 01:57:31 +08:00
config.setIsShare(true); // 在多人登录同一账号时是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
config.setTokenStyle("uuid"); // token风格
2021-06-09 23:25:29 +08:00
config.setIsLog(false); // 是否输出操作日志
2021-02-12 01:57:31 +08:00
return config;
2020-12-24 22:51:57 +08:00
}
2021-02-12 01:57:31 +08:00
}
2020-12-24 22:51:57 +08:00
```
2021-10-11 01:09:28 +08:00
模式2
2021-07-04 22:31:28 +08:00
``` java
// 以代码的方式配置Sa-Token-Config
@Autowired
public void configSaToken(SaTokenConfig config) {
// config.setTokenName("satoken333"); // token名称 (同时也是cookie名称)
// ...
}
```
2021-10-11 01:09:28 +08:00
PS两者的区别在于**`模式1会覆盖yml中的配置模式2会与yml中的配置合并`**
2021-07-04 22:31:28 +08:00
2020-12-24 22:51:57 +08:00
---
### 所有可配置项
2022-06-30 09:35:56 +08:00
你不必立刻掌握整个表格,只需要在用到某个功能时再详细查阅它即可
| 参数名称 | 类型 | 默认值 | 说明 |
| :-------- | :-------- | :-------- | :-------- |
2022-06-30 09:35:56 +08:00
| 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) |
| 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) |
2021-08-31 01:03:25 +08:00
| isReadBody | Boolean | true | 是否尝试从 请求体 里读取 Token |
| isReadHead | Boolean | true | 是否尝试从 header 里读取 Token |
2022-06-30 09:35:56 +08:00
| isReadCookie | Boolean | true | 是否尝试从 cookie 里读取 Token此值为 false 后,`StpUtil.login(id)` 登录时也不会再往前端注入Cookie |
| tokenStyle | String | uuid | token风格 [参考自定义Token风格](/up/token-style) |
| dataRefreshPeriod | int | 30 | 默认数据持久组件实现类中,每次清理过期数据间隔的时间 (单位: 秒) 默认值30秒设置为-1代表不启动定时清理 |
| tokenSessionCheckLogin | Boolean | true | 获取 `Token-Session` 时是否必须登录 如果配置为true会在每次获取 `Token-Session` 时校验是否登录),[详解](/use/config?id=tokenSessionCheckLogin) |
2022-06-30 10:50:41 +08:00
| autoRenew | Boolean | true | 是否打开自动续签 如果此值为true, 框架会在每次直接或间接调用 `getLoginId()` 时进行一次过期检查与续签操作),[参考token有效期详解](/fun/token-timeout) |
| tokenPrefix | String | null | token前缀例如填写 `Bearer` 实际传参 `satoken: Bearer xxxx-xxxx-xxxx-xxxx` [参考自定义Token前缀](/up/token-prefix) |
2021-06-16 17:48:21 +08:00
| isPrint | Boolean | true | 是否在初始化配置时打印版本字符画 |
2021-06-09 23:25:29 +08:00
| isLog | Boolean | false | 是否打印操作日志 |
2022-06-30 10:50:41 +08:00
| jwtSecretKey | String | null | jwt秘钥 (只有集成 `sa-token-temp-jwt` 模块时此参数才会生效),[参考:和 jwt 集成](/plugin/jwt-extend) |
| idTokenTimeout | long | 86400 | Id-Token的有效期 (单位: 秒),[参考:内部服务外网隔离](/micro/id-token) |
2021-08-31 01:03:25 +08:00
| basic | String | "" | Http Basic 认证的账号和密码 [参考Http Basic 认证](/up/basic-auth) |
| currDomain | String | null | 配置当前项目的网络访问地址 |
| checkIdToken | Boolean | false | 是否校验Id-Token部分rpc插件有效 |
2021-10-11 01:09:28 +08:00
| cookie | Object | new SaCookieConfig() | Cookie配置对象 |
Cookie相关配置
| 参数名称 | 类型 | 默认值 | 说明 |
| :-------- | :-------- | :-------- | :-------- |
| domain | String | null | 作用域写入Cookie时显式指定的作用域, 常用于单点登录二级域名共享Cookie的场景 |
| path | String | / | 路径,默认写在域名根路径下 |
| secure | Boolean | false | 是否只在 https 协议下有效 |
| httpOnly | Boolean | false | 是否禁止 js 操作 Cookie |
| sameSite | String | Lax | 第三方限制级别Strict=完全禁止Lax=部分允许None=不限制) |
2021-07-02 15:30:43 +08:00
### 单点登录相关配置
2021-09-29 23:43:01 +08:00
Server 端:
| 参数名称 | 类型 | 默认值 | 说明 |
| :-------- | :-------- | :-------- | :-------- |
| ticketTimeout | long | 300 | ticket 有效期 (单位: 秒) |
| allowUrl | String | * | 所有允许的授权回调地址多个用逗号隔开不在此列表中的URL将禁止下放ticket参考[SSO整合配置域名校验](/sso/sso-check-domain) |
| isSlo | Boolean | false | 是否打开单点注销功能 |
2022-07-04 11:48:29 +08:00
| isHttp | Boolean | false | 是否打开模式三(此值为 true 时将使用 http 请求校验ticket值、单点注销、获取userinfo参考[详解](/use/config?id=isHttp) |
2021-09-29 23:43:01 +08:00
| secretkey | String | null | 调用秘钥 用于SSO模式三单点注销的接口通信身份校验 |
Client 端:
| 参数名称 | 类型 | 默认值 | 说明 |
| :-------- | :-------- | :-------- | :-------- |
| authUrl | String | null | 配置 Server 端单点登录授权地址 |
| isSlo | Boolean | false | 是否打开单点注销功能 |
2022-07-04 11:48:29 +08:00
| isHttp | Boolean | false | 是否打开模式三(此值为 true 时将使用 http 请求校验ticket值、单点注销、获取userinfo参考[详解](/use/config?id=isHttp) |
2021-09-29 23:43:01 +08:00
| checkTicketUrl| String | null | 配置 Server 端的 ticket 校验地址 |
| userinfoUrl | String | null | 配置 Server 端查询 userinfo 地址 |
| sloUrl | String | null | 配置 Server 端单点注销地址 |
| ssoLogoutCall | String | null | 配置当前 Client 端的单点注销回调URL (为空时自动获取) |
| secretkey | String | null | 接口调用秘钥 用于SSO模式三单点注销的接口通信身份校验 |
2021-07-02 15:30:43 +08:00
配置示例:
``` yml
2021-07-22 04:22:59 +08:00
# Sa-Token 配置
2021-07-02 15:30:43 +08:00
sa-token:
# SSO-相关配置
sso:
2021-10-11 01:09:28 +08:00
# SSO-Server端 单点登录授权地址
2021-07-09 02:31:34 +08:00
auth-url: http://sa-sso-server.com:9000/sso/auth
2021-07-19 01:12:55 +08:00
```
### OAuth2.0相关配置
| 参数名称 | 类型 | 默认值 | 说明 |
| :-------- | :-------- | :-------- | :-------- |
2022-02-08 16:05:54 +08:00
| 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` 的有效时间 |
2021-07-19 01:12:55 +08:00
配置示例:
``` yml
2021-07-22 04:22:59 +08:00
# Sa-Token 配置
2021-07-19 01:12:55 +08:00
sa-token:
token-name: satoken-server
# OAuth2.0 配置
oauth2:
is-code: true
is-implicit: true
is-password: true
is-client: true
```
2022-02-08 16:05:54 +08:00
##### 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` |
2022-06-30 10:50:41 +08:00
| isAutoMode | Boolean | true | 是否自动判断此 Client 开放的授权模式。 参考:[详解](/use/config?id=isAutoMode) |
2022-02-08 16:05:54 +08:00
| 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` 保存的时间(单位:秒) [默认取全局配置] |
2022-06-30 09:35:56 +08:00
### 部分配置项详解
对部分配置项做一下详解
#### maxLoginCount
配置含义:同一账号最大登录数量。
在配置 `isConcurrent=true`, `isShare=false`Sa-Token 将允许同一账号并发登录且每次登录都会产生一个新Token
这些 Token 都会以 `TokenSign` 的形式记录在其 `User-Session` 之上,这就造成一个问题:
随着同一账号登录的次数越来越多TokenSign 的列表也会越来越大,极端情况下,列表长度可能达到成百上千以上,严重拖慢数据处理速度,
为此 Sa-Token 对这个 TokenSign 列表的大小设定一个上限值,也就是 `maxLoginCount`,默认值=12。
假设一个账号的登录数量超过 `maxLoginCount` 后,将会主动注销第一个登录的会话(先进先出),以此保证队列中的有效会话数量始终 `<= maxLoginCount` 值。
#### tokenSessionCheckLogin
配置含义:获取 `Token-Session` 时是否必须登录 如果配置为true会在每次获取 `Token-Session` 时校验是否登录)。
2022-06-30 10:50:41 +08:00
在调用 `StpUtil.login(id)` 登录后,
2022-06-30 09:35:56 +08:00
- 调用 `StpUtil.getSession()` 可以获取这个会话的 `User-Session` 对象。
- 调用 `StpUtil.getTokenSession()` 可以获取这个会话 `Token-Session` 对象。
关于两种 Session 有何区别,可以参考这篇:[Session模型详解](/fun/session-model),此处暂不赘述。
从设计上讲无论会话是否已经登录只要前端提供了Token我们就可以找到这个 Token 的专属 `Token-Session` 对象,**这非常灵活但不安全**
因为前端提交的 Token 可能是任意伪造的。
为了解决这个问题,`StpUtil.getTokenSession()` 方法在获取 `Token-Session` 时,会率先检测一下这个 Token 是否是一个有效Token
- 如果是有效Token正常返回 `Token-Session` 对象
2022-06-30 10:50:41 +08:00
- 如果是无效Token则抛出异常。
2022-06-30 09:35:56 +08:00
2022-06-30 10:50:41 +08:00
这样就保证了伪造的 Token 是无法获取 `Token-Session` 对象的。
2022-06-30 09:35:56 +08:00
2022-08-11 01:52:28 +08:00
但是 —— 有的场景下我们又确实需要在登录之前就使用 Token-Session 对象,这时候就把配置项 `tokenSessionCheckLogin` 值改为 `false` 即可。
2022-06-30 09:35:56 +08:00
2022-06-30 10:50:41 +08:00
#### isAutoMode
配置含义:是否自动判断此 Client 开放的授权模式。
- 此值为 true 时:四种模式(`isCode、isImplicit、isPassword、isClient`)是否生效,依靠全局设置;
- 此值为 false 时:四种模式(`isCode、isImplicit、isPassword、isClient`)是否生效,依靠局部配置+全局配置(两个都为 true 时才打开)
2022-06-30 09:35:56 +08:00
2022-07-04 11:48:29 +08:00
#### isHttp
配置含义:是否打开单点登录模式三。
- 此配置项为 false 时代表使用SSO模式二使用 Redis 校验 ticket 值、删除 Redis 数据做到单点注销、使用 Redis 同步 Userinfo 数据。
- 此配置项为 true 时代表使用SSO模式三使用 Http 请求校验 ticket 值、使用 Http 请求做到单点注销、使用 Http 请求同步 Userinfo 数据。