mirror of
https://gitee.com/dromara/sa-token.git
synced 2024-12-02 11:57:40 +08:00
配置类字段 isReadHead 改为 isReadHeader
This commit is contained in:
parent
8a673f8d5d
commit
b119213493
@ -41,7 +41,7 @@ public class SaTokenConfig implements Serializable {
|
||||
private Boolean isReadBody = true;
|
||||
|
||||
/** 是否尝试从header里读取token */
|
||||
private Boolean isReadHead = true;
|
||||
private Boolean isReadHeader = true;
|
||||
|
||||
/** 是否尝试从cookie里读取token */
|
||||
private Boolean isReadCookie = true;
|
||||
@ -211,16 +211,16 @@ public class SaTokenConfig implements Serializable {
|
||||
/**
|
||||
* @return 是否尝试从header里读取token
|
||||
*/
|
||||
public Boolean getIsReadHead() {
|
||||
return isReadHead;
|
||||
public Boolean getIsReadHeader() {
|
||||
return isReadHeader;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param isReadHead 是否尝试从header里读取token
|
||||
* @param isReadHeader 是否尝试从header里读取token
|
||||
* @return 对象自身
|
||||
*/
|
||||
public SaTokenConfig setIsReadHead(Boolean isReadHead) {
|
||||
this.isReadHead = isReadHead;
|
||||
public SaTokenConfig setIsReadHeader(Boolean isReadHeader) {
|
||||
this.isReadHeader = isReadHeader;
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -460,7 +460,7 @@ public class SaTokenConfig implements Serializable {
|
||||
+ ", isShare=" + isShare
|
||||
+ ", maxLoginCount=" + maxLoginCount
|
||||
+ ", isReadBody=" + isReadBody
|
||||
+ ", isReadHead=" + isReadHead
|
||||
+ ", isReadHeader=" + isReadHeader
|
||||
+ ", isReadCookie=" + isReadCookie
|
||||
+ ", tokenStyle=" + tokenStyle
|
||||
+ ", dataRefreshPeriod=" + dataRefreshPeriod
|
||||
@ -480,44 +480,22 @@ public class SaTokenConfig implements Serializable {
|
||||
|
||||
|
||||
/**
|
||||
* <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 setIsConcurrent() ,使用方式保持不变 </h1>
|
||||
* @param allowConcurrentLogin see note
|
||||
* @return see note
|
||||
* <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 getIsReadHead() ,使用方式保持不变 </h1>
|
||||
* @return 是否尝试从header里读取token
|
||||
*/
|
||||
@Deprecated
|
||||
public SaTokenConfig setAllowConcurrentLogin(Boolean allowConcurrentLogin) {
|
||||
this.isConcurrent = allowConcurrentLogin;
|
||||
return this;
|
||||
public Boolean getIsReadHead() {
|
||||
return isReadHeader;
|
||||
}
|
||||
|
||||
/**
|
||||
* <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 setIsConcurrent() ,使用方式保持不变 </h1>
|
||||
* @param isV see note
|
||||
* @return see note
|
||||
*/
|
||||
@Deprecated
|
||||
public SaTokenConfig setIsV(Boolean isV) {
|
||||
this.isPrint = isV;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 getCookie().getDomain() ,使用方式保持不变 </h1>
|
||||
* @return 写入Cookie时显式指定的作用域, 常用于单点登录二级域名共享Cookie的场景
|
||||
*/
|
||||
@Deprecated
|
||||
public String getCookieDomain() {
|
||||
return getCookie().getDomain();
|
||||
}
|
||||
|
||||
/**
|
||||
* <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 getCookie().setDomain() ,使用方式保持不变 </h1>
|
||||
* @param cookieDomain 写入Cookie时显式指定的作用域, 常用于单点登录二级域名共享Cookie的场景
|
||||
* <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 setIsReadHead() ,使用方式保持不变 </h1>
|
||||
* @param isReadHeader 是否尝试从header里读取token
|
||||
* @return 对象自身
|
||||
*/
|
||||
@Deprecated
|
||||
public SaTokenConfig setCookieDomain(String cookieDomain) {
|
||||
this.getCookie().setDomain(cookieDomain);
|
||||
public SaTokenConfig setIsReadHead(Boolean isReadHead) {
|
||||
this.isReadHeader = isReadHead;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,17 @@ public class SaTokenConfigFactory {
|
||||
* @return 一个SaTokenConfig对象
|
||||
*/
|
||||
public static SaTokenConfig createConfig() {
|
||||
Map<String, String> map = readPropToMap(configPath);
|
||||
return createConfig(configPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据指定路径路径获取配置信息
|
||||
*
|
||||
* @param path 配置文件路径
|
||||
* @return 一个SaTokenConfig对象
|
||||
*/
|
||||
public static SaTokenConfig createConfig(String path) {
|
||||
Map<String, String> map = readPropToMap(path);
|
||||
if (map == null) {
|
||||
// throw new RuntimeException("找不到配置文件:" + configPath, null);
|
||||
}
|
||||
|
@ -209,7 +209,7 @@ public class StpLogic {
|
||||
tokenValue = request.getParam(keyTokenName);
|
||||
}
|
||||
// 3. 尝试从header里读取
|
||||
if(tokenValue == null && config.getIsReadHead()){
|
||||
if(tokenValue == null && config.getIsReadHeader()){
|
||||
tokenValue = request.getHeader(keyTokenName);
|
||||
}
|
||||
// 4. 尝试从cookie里读取
|
||||
|
@ -6,7 +6,7 @@
|
||||
> 2. 问题已得到处理的 issue 请大家及时手动关闭,如果超过24小时没有追问,我们将默认提交者已找到解决方案,关闭issue。
|
||||
> 3. 有时候 issue 提交之后,没有得到及时回复,大家可以加入QQ群@管理员寻求帮助。
|
||||
> 4. 请大家新建 issue 时删除不必要的模板信息、精简语句、**做好代码排版**,对于不方便描述的业务场景,可参阅 [Sa-Token 名词解释](https://sa-token.dev33.cn/doc/index.html#/more/noun-intro) 方便组织语句,这样有助于减低大家的沟通成本。
|
||||
|
||||
> 5. **代码截图要带上行号!报错信息要把异常堆栈截全!页面截图要把地址栏带上!Ajax请求要把请求地址、请求头、请求参数都截全!**
|
||||
|
||||
|
||||
---
|
||||
|
@ -43,7 +43,7 @@
|
||||
**如果是:未能读取到有效Token**
|
||||
- 可能1:前端没有提交 Token(最好从前端f12控制台看看请求参数里有 token 吗)。
|
||||
- 可能2:前端提交了 Token,但是参数名不对。默认参数名是 `satoken`,可通过配置文件 `sa-token.token-name: satoken` 来更改。
|
||||
- 可能3:前端提交了 Token,但是你配置了框架不读取,比如说你配置了 `is-read-head=false`(关闭header读取),此时你再从 header 里提交token,框架就无法读取到。
|
||||
- 可能3:前端提交了 Token,但是你配置了框架不读取,比如说你配置了 `is-read-header=false`(关闭header读取),此时你再从 header 里提交token,框架就无法读取到。
|
||||
- 可能4:前端提交了 Token,但是 Token前缀 不对,可参考:[自定义 Token 前缀](/up/token-prefix)
|
||||
- 可能5:你使用了 Nginx 反向代理,而且配置了 自定义Token名称,而且自定义的名称还带有下划线(比如 shop_token),而且还是你的项目还是从 Header头提交Token的,此时 Nginx 默认会吞掉你的下划线参数,可参考:[nginx做转发时,带下划线的header参数丢失](https://blog.csdn.net/zfw_666666/article/details/124420828)
|
||||
|
||||
@ -53,7 +53,7 @@
|
||||
- 可能3:在不集成 Redis 的情况下:颁发 token 后,项目重启了,导致 token 无效。
|
||||
- 可能4:在集成 Redis 的情况下:颁发 token 后,Redis重启了,导致 token 无效。
|
||||
- 可能5:你提交的 token 和框架读取到的 token 不一致:
|
||||
- 可能5.1:比如说你配置了`is-read-head=false`(关闭header读取),然后你从header提交`token-A`,而框架从Cookie里读取`token-B`,导致鉴权不通过(框架读取顺序为`body->header->cookie`)
|
||||
- 可能5.1:比如说你配置了`is-read-header=false`(关闭header读取),然后你从header提交`token-A`,而框架从Cookie里读取`token-B`,导致鉴权不通过(框架读取顺序为`body->header->cookie`)
|
||||
- 可能5.2:比如说你配置了`token-name=x-token`(自定义token名称),此时你从header提交:`satoken:token-A`(参数名没对上),然后框架从header里读取不到你提交的token,转而继续从Cookie读取到了`token-B`。
|
||||
- 可能6:在集成 jwt 插件的情况下:
|
||||
- 如果使用的是 Simple 模式:情况和不集成jwt一样。
|
||||
|
@ -84,7 +84,7 @@ PS:两者的区别在于:**`模式1会覆盖yml中的配置,模式2会与y
|
||||
| isShare | Boolean | true | 在多人登录同一账号时,是否共用一个token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token) |
|
||||
| maxLoginCount | int | 12 | 同一账号最大登录数量,-1代表不限 (只有在 `isConcurrent=true`, `isShare=false` 时此配置才有效),[详解](/use/config?id=配置项详解:maxlogincount) |
|
||||
| isReadBody | Boolean | true | 是否尝试从 请求体 里读取 Token |
|
||||
| isReadHead | Boolean | true | 是否尝试从 header 里读取 Token |
|
||||
| isReadHeader | Boolean | true | 是否尝试从 header 里读取 Token |
|
||||
| isReadCookie | Boolean | true | 是否尝试从 cookie 里读取 Token,此值为 false 后,`StpUtil.login(id)` 登录时也不会再往前端注入Cookie |
|
||||
| tokenStyle | String | uuid | token风格, [参考:自定义Token风格](/up/token-style) |
|
||||
| dataRefreshPeriod | int | 30 | 默认数据持久组件实现类中,每次清理过期数据间隔的时间 (单位: 秒) ,默认值30秒,设置为-1代表不启动定时清理 |
|
||||
|
@ -0,0 +1,125 @@
|
||||
package cn.dev33.satoken.core.config;
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import cn.dev33.satoken.config.SaCookieConfig;
|
||||
import cn.dev33.satoken.config.SaTokenConfig;
|
||||
import cn.dev33.satoken.config.SaTokenConfigFactory;
|
||||
|
||||
/**
|
||||
* 配置类测试
|
||||
*
|
||||
* @author kong
|
||||
* @since: 2022-9-4
|
||||
*/
|
||||
public class SaTokenConfigTest {
|
||||
|
||||
// 基本 get set 测试
|
||||
@Test
|
||||
public void testProp() {
|
||||
SaTokenConfig config = new SaTokenConfig();
|
||||
|
||||
config.setTokenName("nav-token");
|
||||
Assertions.assertEquals(config.getTokenName(), "nav-token");
|
||||
|
||||
config.setTimeout(100204);
|
||||
Assertions.assertEquals(config.getTimeout(), 100204);
|
||||
|
||||
config.setActivityTimeout(1804);
|
||||
Assertions.assertEquals(config.getActivityTimeout(), 1804);
|
||||
|
||||
config.setIsConcurrent(false);
|
||||
Assertions.assertEquals(config.getIsConcurrent(), false);
|
||||
|
||||
config.setIsShare(false);
|
||||
Assertions.assertEquals(config.getIsShare(), false);
|
||||
|
||||
config.setMaxLoginCount(11);
|
||||
Assertions.assertEquals(config.getMaxLoginCount(), 11);
|
||||
|
||||
config.setIsReadBody(false);
|
||||
Assertions.assertEquals(config.getIsReadBody(), false);
|
||||
|
||||
config.setIsReadHeader(false);
|
||||
Assertions.assertEquals(config.getIsReadHeader(), false);
|
||||
|
||||
config.setIsReadCookie(false);
|
||||
Assertions.assertEquals(config.getIsReadCookie(), false);
|
||||
|
||||
config.setTokenStyle("tik");
|
||||
Assertions.assertEquals(config.getTokenStyle(), "tik");
|
||||
|
||||
config.setDataRefreshPeriod(111);
|
||||
Assertions.assertEquals(config.getDataRefreshPeriod(), 111);
|
||||
|
||||
config.setTokenSessionCheckLogin(false);
|
||||
Assertions.assertEquals(config.getTokenSessionCheckLogin(), false);
|
||||
|
||||
config.setAutoRenew(false);
|
||||
Assertions.assertEquals(config.getAutoRenew(), false);
|
||||
|
||||
config.setTokenPrefix("token");
|
||||
Assertions.assertEquals(config.getTokenPrefix(), "token");
|
||||
|
||||
config.setIsPrint(false);
|
||||
Assertions.assertEquals(config.getIsPrint(), false);
|
||||
|
||||
config.setIsLog(false);
|
||||
Assertions.assertEquals(config.getIsLog(), false);
|
||||
|
||||
config.setJwtSecretKey("NgdfaXasARggr");
|
||||
Assertions.assertEquals(config.getJwtSecretKey(), "NgdfaXasARggr");
|
||||
|
||||
config.setIdTokenTimeout(1004);
|
||||
Assertions.assertEquals(config.getIdTokenTimeout(), 1004);
|
||||
|
||||
config.setBasic("sa:123456");
|
||||
Assertions.assertEquals(config.getBasic(), "sa:123456");
|
||||
|
||||
config.setCurrDomain("http://127.0.0.1:8084");
|
||||
Assertions.assertEquals(config.getCurrDomain(), "http://127.0.0.1:8084");
|
||||
|
||||
config.setCheckIdToken(false);
|
||||
Assertions.assertEquals(config.getCheckIdToken(), false);
|
||||
|
||||
SaCookieConfig scc = new SaCookieConfig();
|
||||
config.setCookie(scc);
|
||||
Assertions.assertEquals(config.getCookie(), scc);
|
||||
}
|
||||
|
||||
// 从文件读取
|
||||
@Test
|
||||
public void testSaTokenConfigFactory() {
|
||||
SaTokenConfig config = SaTokenConfigFactory.createConfig("sa-token2.properties");
|
||||
Assertions.assertEquals(config.getTokenName(), "use-token");
|
||||
Assertions.assertEquals(config.getTimeout(), 9000);
|
||||
Assertions.assertEquals(config.getActivityTimeout(), 240);
|
||||
Assertions.assertEquals(config.getIsConcurrent(), false);
|
||||
Assertions.assertEquals(config.getIsShare(), false);
|
||||
Assertions.assertEquals(config.getIsLog(), true);
|
||||
}
|
||||
|
||||
// 测试 SaCookieConfig
|
||||
@Test
|
||||
public void testSaCookieConfig() {
|
||||
SaCookieConfig config = new SaCookieConfig();
|
||||
|
||||
config.setDomain("stp.cn");
|
||||
Assertions.assertEquals(config.getDomain(), "stp.cn");
|
||||
|
||||
config.setPath("/pro/");
|
||||
Assertions.assertEquals(config.getPath(), "/pro/");
|
||||
|
||||
config.setSecure(true);
|
||||
Assertions.assertEquals(config.getSecure(), true);
|
||||
|
||||
config.setHttpOnly(false);
|
||||
Assertions.assertEquals(config.getHttpOnly(), false);
|
||||
|
||||
config.setSameSite("lax");
|
||||
Assertions.assertEquals(config.getSameSite(), "lax");
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
# 端口
|
||||
server:
|
||||
port: 8081
|
||||
|
||||
# Sa-Token配置
|
||||
sa-token:
|
||||
# Token名称 (同时也是cookie名称)
|
||||
token-name: satoken
|
||||
|
||||
|
@ -0,0 +1,12 @@
|
||||
# token名称 (同时也是cookie名称)
|
||||
tokenName=use-token
|
||||
# token有效期,单位s 默认30天, -1代表永不过期
|
||||
timeout=9000
|
||||
# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
|
||||
activityTimeout=240
|
||||
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) =-1
|
||||
isConcurrent=false
|
||||
# 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
|
||||
isShare=false
|
||||
# token风格
|
||||
isLog=true
|
Loading…
Reference in New Issue
Block a user