配置类字段 isReadHead 改为 isReadHeader

This commit is contained in:
click33 2022-09-04 04:03:03 +08:00
parent 8a673f8d5d
commit b119213493
9 changed files with 178 additions and 43 deletions

View File

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

View File

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

View File

@ -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里读取

View File

@ -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请求要把请求地址、请求头、请求参数都截全**
---

View File

@ -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一样。

View File

@ -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代表不启动定时清理 |

View File

@ -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");
}
}

View File

@ -0,0 +1,10 @@
# 端口
server:
port: 8081
# Sa-Token配置
sa-token:
# Token名称 (同时也是cookie名称)
token-name: satoken

View File

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