diff --git a/.gitee/ISSUE_TEMPLATE.md b/.gitee/ISSUE_TEMPLATE.md
index 17b29a20..8c2f41de 100644
--- a/.gitee/ISSUE_TEMPLATE.md
+++ b/.gitee/ISSUE_TEMPLATE.md
@@ -1,2 +1,2 @@
请在以下地址复制 issue 模板进行提交:
-https://sa-token.dev33.cn/doc.html#/fun/issue-template
+https://sa-token.cc/doc.html#/fun/issue-template
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index 17b29a20..8c2f41de 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -1,2 +1,2 @@
请在以下地址复制 issue 模板进行提交:
-https://sa-token.dev33.cn/doc.html#/fun/issue-template
+https://sa-token.cc/doc.html#/fun/issue-template
diff --git a/README.md b/README.md
index 5ae7d794..9c701cfa 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
Sa-Token v1.31.0
一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!
@@ -16,7 +16,7 @@
---
## 前言:
-- [在线文档:http://sa-token.dev33.cn/](http://sa-token.dev33.cn/)
+- [在线文档:https://sa-token.cc](https://sa-token.cc)
- 注:学习测试请拉取 master 分支,dev 为正在开发的分支,有很多特性并不稳定。
@@ -27,26 +27,33 @@
**Sa-Token** 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。
-登录认证示例:
+Sa-Token 旨在以简单、优雅的方式完成系统的权限认证部分,以登录认证为例,你只需要:
``` java
-// 会话登录:参数指定在当前客户端登录的账号id
+// 会话登录,参数填登录人的账号id
StpUtil.login(10001);
-
-// 会话校验:在需要校验登录处调用以下方法,如果会话未登录会抛出 `NotLoginException` 异常
-StpUtil.checkLogin();
-
-// 会话注销:在当前客户端退出已登录的会话
-StpUtil.logout();
```
+无需实现任何接口,无需创建任何配置文件,只需要这一句静态代码的调用,便可以完成会话登录认证。
+
+如果一个接口需要登录后才能访问,我们只需调用以下代码:
+
+``` java
+// 校验当前客户端是否已经登录,如果未登录则抛出 `NotLoginException` 异常
+StpUtil.checkLogin();
+```
+
+在 Sa-Token 中,大多数功能都可以一行代码解决:
+
踢人下线:
+
``` java
// 将账号id为 10077 的会话踢下线
StpUtil.kickout(10077);
```
-权限认证示例:
+权限认证:
+
``` java
// 注解鉴权:只有具备 `user:add` 权限的会话才可以进入方法
@SaCheckPermission("user:add")
@@ -70,6 +77,8 @@ registry.addInterceptor(new SaInterceptor(handler -> {
})).addPathPatterns("/**");
```
+当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,Sa-Token 的 API 设计是多么的简单、优雅!
+
## Sa-Token 功能模块一览
@@ -115,13 +124,13 @@ Sa-Token-SSO 由简入难划分为三种模式,解决不同架构下的 SSO
| 系统架构 | 采用模式 | 简介 | 文档链接 |
| :-------- | :-------- | :-------- | :-------- |
-| 前端同域 + 后端同 Redis | 模式一 | 共享Cookie同步会话 | [文档](http://sa-token.dev33.cn/doc.html#/sso/sso-type1)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso1-client) |
-| 前端不同域 + 后端同 Redis | 模式二 | URL重定向传播会话 | [文档](http://sa-token.dev33.cn/doc.html#/sso/sso-type2)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso2-client) |
-| 前端不同域 + 后端 不同Redis | 模式三 | Http请求获取会话 | [文档](http://sa-token.dev33.cn/doc.html#/sso/sso-type3)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso3-client) |
+| 前端同域 + 后端同 Redis | 模式一 | 共享Cookie同步会话 | [文档](https://sa-token.cc/doc.html#/sso/sso-type1)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso1-client) |
+| 前端不同域 + 后端同 Redis | 模式二 | URL重定向传播会话 | [文档](https://sa-token.cc/doc.html#/sso/sso-type2)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso2-client) |
+| 前端不同域 + 后端 不同Redis | 模式三 | Http请求获取会话 | [文档](https://sa-token.cc/doc.html#/sso/sso-type3)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso3-client) |
1. 前端同域:就是指多个系统可以部署在同一个主域名之下,比如:`c1.domain.com`、`c2.domain.com`、`c3.domain.com`
-2. 后端同Redis:就是指多个系统可以连接同一个Redis。PS:这里并不需要把所有项目的数据都放在同一个Redis中,Sa-Token提供了 **`[权限缓存与业务缓存分离]`** 的解决方案,详情戳:[Alone独立Redis插件](http://sa-token.dev33.cn/doc.html#/plugin/alone-redis)
+2. 后端同Redis:就是指多个系统可以连接同一个Redis。PS:这里并不需要把所有项目的数据都放在同一个Redis中,Sa-Token提供了 **`[权限缓存与业务缓存分离]`** 的解决方案,详情戳:[Alone独立Redis插件](https://sa-token.cc/doc.html#/plugin/alone-redis)
3. 如果既无法做到前端同域,也无法做到后端同Redis,那么只能走模式三,Http请求获取会话(Sa-Token对SSO提供了完整的封装,你只需要按照示例从文档上复制几段代码便可以轻松集成)
## Sa-Token-OAuth2 授权认证
@@ -134,7 +143,7 @@ Sa-OAuth2 模块分为四种授权模式,解决不同场景下的授权需求
| 密码式(Password) | Client直接拿着用户的账号密码换取授权 Token |
| 客户端凭证(Client Credentials)| Server 端针对 Client 级别的 Token,代表应用自身的资源授权 |
-详细参考文档:[http://sa-token.dev33.cn/doc.html#/oauth2/readme](http://sa-token.dev33.cn/doc.html#/oauth2/readme)
+详细参考文档:[https://sa-token.cc/doc.html#/oauth2/readme](https://sa-token.cc/doc.html#/oauth2/readme)
## 使用 Sa-Token 的开源项目
diff --git a/pom.xml b/pom.xml
index dd1b01c9..894d9f3c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -41,6 +41,23 @@
1.8
utf-8
utf-8
+
+ 2.5.12
+ 5.0.4.RELEASE
+ 3.1.4.RELEASE
+ 2.12.6.1
+ 3.1.0
+ 3.0.9.RELEASE
+ 1.10.4
+ 1.9.1
+ 1.4.3
+ 4.9.17
+ 3.14.4
+ 2.5.0
+ 2.7.15
+ 2.10.1.RELEASE
+ 5.8.5
+ 0.9.1
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java
index 48b6ac71..53026e9a 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java
@@ -5,7 +5,7 @@ import java.io.Serializable;
/**
* Sa-Token 配置类 Model
*
- * 你可以通过yml、properties、java代码等形式配置本类参数,具体请查阅官方文档: http://sa-token.dev33.cn/
+ * 你可以通过yml、properties、java代码等形式配置本类参数,具体请查阅官方文档: https://sa-token.cc/
*
* @author kong
*
@@ -46,6 +46,9 @@ public class SaTokenConfig implements Serializable {
/** 是否尝试从cookie里读取token */
private Boolean isReadCookie = true;
+ /** 是否在登录后将 Token 写入到响应头 */
+ private Boolean isWriteHeader = false;
+
/** token风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) */
private String tokenStyle = "uuid";
@@ -240,6 +243,22 @@ public class SaTokenConfig implements Serializable {
return this;
}
+ /**
+ * @return 是否在登录后将 Token 写入到响应头
+ */
+ public Boolean getIsWriteHeader() {
+ return isWriteHeader;
+ }
+
+ /**
+ * @param isWriteHeader 是否在登录后将 Token 写入到响应头
+ * @return 对象自身
+ */
+ public SaTokenConfig setIsWriteHeader(Boolean isWriteHeader) {
+ this.isWriteHeader = isWriteHeader;
+ return this;
+ }
+
/**
* @return token风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
*/
@@ -462,6 +481,7 @@ public class SaTokenConfig implements Serializable {
+ ", isReadBody=" + isReadBody
+ ", isReadHeader=" + isReadHeader
+ ", isReadCookie=" + isReadCookie
+ + ", isWriteHeader=" + isWriteHeader
+ ", tokenStyle=" + tokenStyle
+ ", dataRefreshPeriod=" + dataRefreshPeriod
+ ", tokenSessionCheckLogin=" + tokenSessionCheckLogin
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java b/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java
index 9718f9e5..99984369 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java
@@ -7,6 +7,11 @@ package cn.dev33.satoken.context.model;
*/
public interface SaResponse {
+ /**
+ * 指定前端可以获取到哪些响应头时使用的参数名
+ */
+ public static final String ACCESS_CONTROL_EXPOSE_HEADERS = "Access-Control-Expose-Headers";
+
/**
* 获取底层源对象
* @return see note
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginConfig.java
index 1c70bdca..e25b7ebf 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginConfig.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginConfig.java
@@ -16,7 +16,7 @@ public class SaLoginConfig {
/**
* @param device 此次登录的客户端设备类型
- * @return SaLoginModel配置对象
+ * @return 登录参数 Model
*/
public static SaLoginModel setDevice(String device) {
return create().setDevice(device);
@@ -24,7 +24,7 @@ public class SaLoginConfig {
/**
* @param isLastingCookie 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
- * @return 对象自身
+ * @return 登录参数 Model
*/
public static SaLoginModel setIsLastingCookie(Boolean isLastingCookie) {
return create().setIsLastingCookie(isLastingCookie);
@@ -32,7 +32,7 @@ public class SaLoginConfig {
/**
* @param timeout 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值)
- * @return 对象自身
+ * @return 登录参数 Model
*/
public static SaLoginModel setTimeout(long timeout) {
return create().setTimeout(timeout);
@@ -40,7 +40,7 @@ public class SaLoginConfig {
/**
* @param extraData 扩展信息(只在jwt模式下生效)
- * @return 对象自身
+ * @return 登录参数 Model
*/
public static SaLoginModel setExtraData(Map extraData) {
return create().setExtraData(extraData);
@@ -48,7 +48,7 @@ public class SaLoginConfig {
/**
* @param token 预定Token(预定本次登录生成的Token值)
- * @return 对象自身
+ * @return 登录参数 Model
*/
public static SaLoginModel setToken(String token) {
return create().setToken(token);
@@ -58,12 +58,20 @@ public class SaLoginConfig {
* 写入扩展数据(只在jwt模式下生效)
* @param key 键
* @param value 值
- * @return 对象自身
+ * @return 登录参数 Model
*/
public static SaLoginModel setExtra(String key, Object value) {
return create().setExtra(key, value);
}
+ /**
+ * @param isWriteHeader 是否在登录后将 Token 写入到响应头
+ * @return 登录参数 Model
+ */
+ public static SaLoginModel setIsWriteHeader(Boolean isWriteHeader) {
+ return create().setIsWriteHeader(isWriteHeader);
+ }
+
/**
* 静态方法获取一个 SaLoginModel 对象
* @return SaLoginModel 对象
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java
index 9b3fe71f..1813890f 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java
@@ -23,7 +23,7 @@ public class SaLoginModel {
/**
* 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
*/
- public Boolean isLastingCookie;
+ public Boolean isLastingCookie = true;
/**
* 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值)
@@ -39,6 +39,9 @@ public class SaLoginModel {
* 预定Token(预定本次登录生成的Token值)
*/
public String token;
+
+ /** 是否在登录后将 Token 写入到响应头 */
+ private Boolean isWriteHeader;
/**
@@ -58,12 +61,22 @@ public class SaLoginModel {
}
/**
- * @return 参考 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
+ * @return 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
*/
public Boolean getIsLastingCookie() {
return isLastingCookie;
}
+ /**
+ * @return 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
+ */
+ public Boolean getIsLastingCookieOrFalse() {
+ if(isLastingCookie == null) {
+ return false;
+ }
+ return isLastingCookie;
+ }
+
/**
* @param isLastingCookie 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
* @return 对象自身
@@ -80,6 +93,16 @@ public class SaLoginModel {
return timeout;
}
+ /**
+ * @return timeout 值 (如果此配置项尚未配置,则取全局配置的值)
+ */
+ public Long getTimeoutOrGlobalConfig() {
+ if(timeout == null) {
+ timeout = SaManager.getConfig().getTimeout();
+ }
+ return timeout;
+ }
+
/**
* @param timeout 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值)
* @return 对象自身
@@ -121,13 +144,45 @@ public class SaLoginModel {
return this;
}
+ /**
+ * @return 是否在登录后将 Token 写入到响应头
+ */
+ public Boolean getIsWriteHeader() {
+ return isWriteHeader;
+ }
+
+ /**
+ * @return 是否在登录后将 Token 写入到响应头 (如果此配置项尚未配置,则取全局配置的值)
+ */
+ public Boolean getIsWriteHeaderOrGlobalConfig() {
+ if(isWriteHeader == null) {
+ isWriteHeader = SaManager.getConfig().getIsWriteHeader();
+ }
+ return isWriteHeader;
+ }
+
+ /**
+ * @param isWriteHeader 是否在登录后将 Token 写入到响应头
+ * @return 对象自身
+ */
+ public SaLoginModel setIsWriteHeader(Boolean isWriteHeader) {
+ this.isWriteHeader = isWriteHeader;
+ return this;
+ }
+
/*
* toString
*/
@Override
public String toString() {
- return "SaLoginModel [device=" + device + ", isLastingCookie=" + isLastingCookie + ", timeout=" + timeout
- + ", extraData=" + extraData + ", token=" + token + "]";
+ return "SaLoginModel ["
+ + "device=" + device
+ + ", isLastingCookie=" + isLastingCookie
+ + ", timeout=" + timeout
+ + ", extraData=" + extraData
+ + ", token=" + token
+ + ", isWriteHeader=" + isWriteHeader
+ + "]";
}
// ------ 附加方法
@@ -174,10 +229,10 @@ public class SaLoginModel {
* @return Cookie时长
*/
public int getCookieTimeout() {
- if(isLastingCookie == false) {
+ if(getIsLastingCookieOrFalse() == false) {
return -1;
}
- if(timeout == SaTokenDao.NEVER_EXPIRE) {
+ if(getTimeoutOrGlobalConfig() == SaTokenDao.NEVER_EXPIRE) {
return Integer.MAX_VALUE;
}
return (int)(long)timeout;
@@ -210,12 +265,15 @@ public class SaLoginModel {
// if(device == null) {
// device = SaTokenConsts.DEFAULT_LOGIN_DEVICE;
// }
- if(isLastingCookie == null) {
- isLastingCookie = true;
- }
+// if(isLastingCookie == null) {
+// isLastingCookie = true;
+// }
if(timeout == null) {
timeout = config.getTimeout();
}
+ if(isWriteHeader == null) {
+ isWriteHeader = config.getIsWriteHeader();
+ }
return this;
}
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java
index e8e1a625..81f2dc87 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java
@@ -17,6 +17,7 @@ import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.context.model.SaCookie;
import cn.dev33.satoken.context.model.SaRequest;
+import cn.dev33.satoken.context.model.SaResponse;
import cn.dev33.satoken.context.model.SaStorage;
import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.exception.ApiDisabledException;
@@ -102,7 +103,7 @@ public class StpLogic {
* @param tokenValue token值
*/
public void setTokenValue(String tokenValue){
- setTokenValue(tokenValue, getConfigOfCookieTimeout());
+ setTokenValue(tokenValue, new SaLoginModel().setTimeout(getConfig().getTimeout()));
}
/**
@@ -111,17 +112,31 @@ public class StpLogic {
* @param cookieTimeout Cookie存活时间(秒)
*/
public void setTokenValue(String tokenValue, int cookieTimeout){
+ setTokenValue(tokenValue, new SaLoginModel().setTimeout(cookieTimeout));
+ }
+
+ /**
+ * 在当前会话写入当前TokenValue
+ * @param tokenValue token值
+ * @param loginModel 登录参数
+ */
+ public void setTokenValue(String tokenValue, SaLoginModel loginModel){
if(SaFoxUtil.isEmpty(tokenValue)) {
return;
}
- // 1. 将token保存到[存储器]里
+ // 1. 将 Token 保存到 [存储器] 里
setTokenValueToStorage(tokenValue);
// 2. 将 Token 保存到 [Cookie] 里
if (getConfig().getIsReadCookie()) {
- setTokenValueToCookie(tokenValue, cookieTimeout);
+ setTokenValueToCookie(tokenValue, loginModel.getCookieTimeout());
+ }
+
+ // 3. 将 Token 写入到响应头里
+ if(loginModel.getIsWriteHeaderOrGlobalConfig()) {
+ setTokenValueToResponseHeader(tokenValue);
}
}
@@ -164,6 +179,17 @@ public class StpLogic {
;
SaHolder.getResponse().addCookie(cookie);
}
+
+ /**
+ * 将 Token 写入到 [响应头] 里
+ * @param tokenValue token值
+ */
+ public void setTokenValueToResponseHeader(String tokenValue){
+ String tokenName = getTokenName();
+ SaResponse response = SaHolder.getResponse();
+ response.setHeader(tokenName, tokenValue);
+ response.addHeader(SaResponse.ACCESS_CONTROL_EXPOSE_HEADERS, tokenName);
+ }
/**
* 获取当前TokenValue
@@ -292,7 +318,7 @@ public class StpLogic {
String token = createLoginSession(id, loginModel);
// 2、在当前客户端注入Token
- setTokenValue(token, loginModel.getCookieTimeout());
+ setTokenValue(token, loginModel);
}
/**
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java
index 60d02e10..931d7c3a 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java
@@ -83,7 +83,16 @@ public class StpUtil {
public static void setTokenValue(String tokenValue, int cookieTimeout){
stpLogic.setTokenValue(tokenValue, cookieTimeout);
}
-
+
+ /**
+ * 在当前会话写入当前TokenValue
+ * @param tokenValue token值
+ * @param loginModel 登录参数
+ */
+ public static void setTokenValue(String tokenValue, SaLoginModel loginModel){
+ stpLogic.setTokenValue(tokenValue, loginModel);
+ }
+
/**
* 获取当前TokenValue
* @return 当前tokenValue
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java
index ad45165d..59af034c 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java
@@ -30,7 +30,7 @@ public class SaTokenConsts {
/**
* Sa-Token 开发文档地址
*/
- public static final String DEV_DOC_URL = "http://sa-token.dev33.cn";
+ public static final String DEV_DOC_URL = "https://sa-token.cc";
// =================== 常量key标记 ===================
diff --git a/sa-token-demo/sa-token-demo-alone-redis/pom.xml b/sa-token-demo/sa-token-demo-alone-redis/pom.xml
index 4770482a..7f2a6067 100644
--- a/sa-token-demo/sa-token-demo-alone-redis/pom.xml
+++ b/sa-token-demo/sa-token-demo-alone-redis/pom.xml
@@ -14,9 +14,9 @@
-
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -31,18 +31,18 @@
spring-boot-starter-aop
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-dao-redis-jackson
- ${sa-token-version}
+ ${sa-token.version}
@@ -55,7 +55,7 @@
cn.dev33
sa-token-alone-redis
- ${sa-token-version}
+ ${sa-token.version}
diff --git a/sa-token-demo/sa-token-demo-case/pom.xml b/sa-token-demo/sa-token-demo-case/pom.xml
index ed81e8c5..25e66d42 100644
--- a/sa-token-demo/sa-token-demo-case/pom.xml
+++ b/sa-token-demo/sa-token-demo-case/pom.xml
@@ -15,9 +15,9 @@
-
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -32,18 +32,18 @@
spring-boot-starter-aop
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-dao-redis-jackson
- ${sa-token-version}
+ ${sa-token.version}
diff --git a/sa-token-demo/sa-token-demo-dubbo-consumer/pom.xml b/sa-token-demo/sa-token-demo-dubbo-consumer/pom.xml
index 1d4c4656..50cd6ad8 100644
--- a/sa-token-demo/sa-token-demo-dubbo-consumer/pom.xml
+++ b/sa-token-demo/sa-token-demo-dubbo-consumer/pom.xml
@@ -16,7 +16,7 @@
1.8
3.1.1
- 1.31.1.temp
+ 1.31.1.temp
@@ -31,14 +31,14 @@
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-dao-redis-jackson
- ${sa-token-version}
+ ${sa-token.version}
org.apache.commons
@@ -68,7 +68,7 @@
cn.dev33
sa-token-context-dubbo
- ${sa-token-version}
+ ${sa-token.version}
diff --git a/sa-token-demo/sa-token-demo-dubbo-provider/pom.xml b/sa-token-demo/sa-token-demo-dubbo-provider/pom.xml
index c58b1117..91f59c8e 100644
--- a/sa-token-demo/sa-token-demo-dubbo-provider/pom.xml
+++ b/sa-token-demo/sa-token-demo-dubbo-provider/pom.xml
@@ -16,7 +16,7 @@
1.8
3.1.1
- 1.31.1.temp
+ 1.31.1.temp
@@ -31,14 +31,14 @@
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-dao-redis-jackson
- ${sa-token-version}
+ ${sa-token.version}
org.apache.commons
@@ -68,7 +68,7 @@
cn.dev33
sa-token-context-dubbo
- ${sa-token-version}
+ ${sa-token.version}
diff --git a/sa-token-demo/sa-token-demo-grpc/pom.xml b/sa-token-demo/sa-token-demo-grpc/pom.xml
index bf69b928..c14c9ef8 100644
--- a/sa-token-demo/sa-token-demo-grpc/pom.xml
+++ b/sa-token-demo/sa-token-demo-grpc/pom.xml
@@ -27,7 +27,7 @@
UTF-8
UTF-8
1.18.10
- 1.31.1.temp
+ 1.31.1.temp
@@ -54,17 +54,17 @@
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-dao-redis-jackson
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-context-grpc
- ${sa-token-version}
+ ${sa-token.version}
diff --git a/sa-token-demo/sa-token-demo-jwt/pom.xml b/sa-token-demo/sa-token-demo-jwt/pom.xml
index dac7baec..ce2cf50e 100644
--- a/sa-token-demo/sa-token-demo-jwt/pom.xml
+++ b/sa-token-demo/sa-token-demo-jwt/pom.xml
@@ -14,9 +14,9 @@
-
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -27,25 +27,25 @@
spring-boot-starter-web
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-jwt
- ${sa-token-version}
+ ${sa-token.version}
- 1.31.1.temp
+
+ 1.31.1.temp
@@ -28,11 +28,11 @@
spring-boot-starter-web
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
diff --git a/sa-token-demo/sa-token-demo-oauth2-client/src/main/resources/templates/index.html b/sa-token-demo/sa-token-demo-oauth2-client/src/main/resources/templates/index.html
index 9d5b3121..9bcfde53 100644
--- a/sa-token-demo/sa-token-demo-oauth2-client/src/main/resources/templates/index.html
+++ b/sa-token-demo/sa-token-demo-oauth2-client/src/main/resources/templates/index.html
@@ -91,7 +91,7 @@
更多资料请参考 Sa-Token 官方文档地址:
- http://sa-token.dev33.cn/
+ https://sa-token.cc/
diff --git a/sa-token-demo/sa-token-demo-oauth2-server/pom.xml b/sa-token-demo/sa-token-demo-oauth2-server/pom.xml
index 0acb237b..86244fc9 100644
--- a/sa-token-demo/sa-token-demo-oauth2-server/pom.xml
+++ b/sa-token-demo/sa-token-demo-oauth2-server/pom.xml
@@ -16,8 +16,8 @@
1.8
3.1.1
-
- 1.31.1.temp
+
+ 1.31.1.temp
@@ -28,25 +28,25 @@
spring-boot-starter-web
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-oauth2
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-dao-redis-jackson
- ${sa-token-version}
+ ${sa-token.version}
org.apache.commons
diff --git a/sa-token-demo/sa-token-demo-quick-login/pom.xml b/sa-token-demo/sa-token-demo-quick-login/pom.xml
index 2d1a05ac..6c7fd685 100644
--- a/sa-token-demo/sa-token-demo-quick-login/pom.xml
+++ b/sa-token-demo/sa-token-demo-quick-login/pom.xml
@@ -14,9 +14,9 @@
-
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -27,18 +27,18 @@
spring-boot-starter-web
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-quick-login
- ${sa-token-version}
+ ${sa-token.version}
diff --git a/sa-token-demo/sa-token-demo-quick-login/src/main/java/com/pj/test/TestController.java b/sa-token-demo/sa-token-demo-quick-login/src/main/java/com/pj/test/TestController.java
index 29fd21ba..5ad5cedb 100644
--- a/sa-token-demo/sa-token-demo-quick-login/src/main/java/com/pj/test/TestController.java
+++ b/sa-token-demo/sa-token-demo-quick-login/src/main/java/com/pj/test/TestController.java
@@ -21,7 +21,7 @@ public class TestController {
+ "资源页 (登录后才可进入本页面)
"
+ "
"
+ " Sa-Token " + SaTokenConsts.VERSION_NO + "
";
- return str;
+ return str;
}
}
diff --git a/sa-token-demo/sa-token-demo-quick-login/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-quick-login/src/main/resources/application.yml
index da460501..8b111db3 100644
--- a/sa-token-demo/sa-token-demo-quick-login/src/main/resources/application.yml
+++ b/sa-token-demo/sa-token-demo-quick-login/src/main/resources/application.yml
@@ -19,7 +19,7 @@ sa:
# 指定拦截路径
# include: /**
# 指定排除路径
- # exclude: /sss,/fff
+ # exclude: /1.jpg
# 将本地磁盘的某个路径作为静态资源开放
# dir: file:E:\static
diff --git a/sa-token-demo/sa-token-demo-solon/pom.xml b/sa-token-demo/sa-token-demo-solon/pom.xml
index 970ddb34..ebd39d18 100644
--- a/sa-token-demo/sa-token-demo-solon/pom.xml
+++ b/sa-token-demo/sa-token-demo-solon/pom.xml
@@ -7,9 +7,9 @@
0.0.1-SNAPSHOT
-
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -21,25 +21,25 @@
1.10.4
-
+
cn.dev33
sa-token-solon-plugin
- ${sa-token-version}
+ ${sa-token.version}
@@ -52,7 +52,7 @@
diff --git a/sa-token-demo/sa-token-demo-springboot-redis/pom.xml b/sa-token-demo/sa-token-demo-springboot-redis/pom.xml
index 2fefd3c9..b066e57d 100644
--- a/sa-token-demo/sa-token-demo-springboot-redis/pom.xml
+++ b/sa-token-demo/sa-token-demo-springboot-redis/pom.xml
@@ -15,9 +15,9 @@
-
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -32,25 +32,25 @@
spring-boot-starter-aop
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-dao-redis-jackson
- ${sa-token-version}
+ ${sa-token.version}
diff --git a/sa-token-demo/sa-token-demo-springboot/pom.xml b/sa-token-demo/sa-token-demo-springboot/pom.xml
index f52afcb2..2dd3f1ea 100644
--- a/sa-token-demo/sa-token-demo-springboot/pom.xml
+++ b/sa-token-demo/sa-token-demo-springboot/pom.xml
@@ -15,9 +15,9 @@
-
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -32,18 +32,18 @@
spring-boot-starter-aop
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
diff --git a/sa-token-demo/sa-token-demo-sso-server-h5/login.js b/sa-token-demo/sa-token-demo-sso-server-h5/login.js
index 0b87ab7c..e43a4f48 100644
--- a/sa-token-demo/sa-token-demo-sso-server-h5/login.js
+++ b/sa-token-demo/sa-token-demo-sso-server-h5/login.js
@@ -98,5 +98,5 @@ function getParam(name, defaultValue){
}
// 打印信息
-var str = "This page is provided by Sa-Token, Please refer to: " + "http://sa-token.dev33.cn/";
+var str = "This page is provided by Sa-Token, Please refer to: " + "https://sa-token.cc/";
console.log(str);
diff --git a/sa-token-demo/sa-token-demo-sso-server/pom.xml b/sa-token-demo/sa-token-demo-sso-server/pom.xml
index ce7fd481..1c5d2c21 100644
--- a/sa-token-demo/sa-token-demo-sso-server/pom.xml
+++ b/sa-token-demo/sa-token-demo-sso-server/pom.xml
@@ -14,9 +14,9 @@
-
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -27,25 +27,25 @@
spring-boot-starter-web
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-sso
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-dao-redis-jackson
- ${sa-token-version}
+ ${sa-token.version}
org.apache.commons
diff --git a/sa-token-demo/sa-token-demo-sso-server/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-sso-server/src/main/resources/application.yml
index babc1766..4d405497 100644
--- a/sa-token-demo/sa-token-demo-sso-server/src/main/resources/application.yml
+++ b/sa-token-demo/sa-token-demo-sso-server/src/main/resources/application.yml
@@ -4,9 +4,9 @@ server:
# Sa-Token 配置
sa-token:
- # -------------- SSO-模式一相关配置 (非模式一不需要配置)
+ # ------- SSO-模式一相关配置 (非模式一不需要配置)
# cookie:
- # 配置Cookie作用域
+ # 配置 Cookie 作用域
# domain: stp.com
# ------- SSO-模式二相关配置
@@ -18,7 +18,7 @@ sa-token:
# 是否打开单点注销功能
is-slo: true
- # ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开) -------
+ # ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开)
# 是否打开模式三
isHttp: true
# 接口调用秘钥(用于SSO模式三的单点注销功能)
diff --git a/sa-token-demo/sa-token-demo-sso-server/src/main/resources/static/sa-res/login.js b/sa-token-demo/sa-token-demo-sso-server/src/main/resources/static/sa-res/login.js
index f581ee78..e474f430 100644
--- a/sa-token-demo/sa-token-demo-sso-server/src/main/resources/static/sa-res/login.js
+++ b/sa-token-demo/sa-token-demo-sso-server/src/main/resources/static/sa-res/login.js
@@ -61,5 +61,5 @@ $('[name=name],[name=pwd]').bind('keypress', function(event){
$("[name=name]").focus();
// 打印信息
-var str = "This page is provided by Sa-Token, Please refer to: " + "http://sa-token.dev33.cn/";
+var str = "This page is provided by Sa-Token, Please refer to: " + "https://sa-token.cc/";
console.log(str);
diff --git a/sa-token-demo/sa-token-demo-sso1-client/pom.xml b/sa-token-demo/sa-token-demo-sso1-client/pom.xml
index 3d02ec19..c98dd7bd 100644
--- a/sa-token-demo/sa-token-demo-sso1-client/pom.xml
+++ b/sa-token-demo/sa-token-demo-sso1-client/pom.xml
@@ -14,9 +14,9 @@
-
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -27,25 +27,25 @@
spring-boot-starter-web
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-sso
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-dao-redis-jackson
- ${sa-token-version}
+ ${sa-token.version}
@@ -58,7 +58,7 @@
cn.dev33
sa-token-alone-redis
- ${sa-token-version}
+ ${sa-token.version}
diff --git a/sa-token-demo/sa-token-demo-sso1-client/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-sso1-client/src/main/resources/application.yml
index 3a07ff28..f01c205d 100644
--- a/sa-token-demo/sa-token-demo-sso1-client/src/main/resources/application.yml
+++ b/sa-token-demo/sa-token-demo-sso1-client/src/main/resources/application.yml
@@ -2,7 +2,7 @@
server:
port: 9001
-# sa-token配置
+# Sa-Token 配置
sa-token:
# SSO-相关配置
sso:
@@ -11,7 +11,7 @@ sa-token:
# SSO-Server端-单点注销地址
slo-url: http://sso.stp.com:9000/sso/logout
- # 配置Sa-Token单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis)
+ # 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis)
alone-redis:
# Redis数据库索引
database: 1
diff --git a/sa-token-demo/sa-token-demo-sso2-client/pom.xml b/sa-token-demo/sa-token-demo-sso2-client/pom.xml
index 2c0ec337..b98d79c2 100644
--- a/sa-token-demo/sa-token-demo-sso2-client/pom.xml
+++ b/sa-token-demo/sa-token-demo-sso2-client/pom.xml
@@ -14,9 +14,9 @@
-
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -27,25 +27,25 @@
spring-boot-starter-web
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-sso
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-dao-redis-jackson
- ${sa-token-version}
+ ${sa-token.version}
@@ -58,7 +58,7 @@
cn.dev33
sa-token-alone-redis
- ${sa-token-version}
+ ${sa-token.version}
diff --git a/sa-token-demo/sa-token-demo-sso3-client/pom.xml b/sa-token-demo/sa-token-demo-sso3-client/pom.xml
index dabc819d..31224e47 100644
--- a/sa-token-demo/sa-token-demo-sso3-client/pom.xml
+++ b/sa-token-demo/sa-token-demo-sso3-client/pom.xml
@@ -14,9 +14,9 @@
-
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -27,25 +27,25 @@
spring-boot-starter-web
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-sso
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-dao-redis-jackson
- ${sa-token-version}
+ ${sa-token.version}
diff --git a/sa-token-demo/sa-token-demo-test/pom.xml b/sa-token-demo/sa-token-demo-test/pom.xml
index d8db946a..1dbc211a 100644
--- a/sa-token-demo/sa-token-demo-test/pom.xml
+++ b/sa-token-demo/sa-token-demo-test/pom.xml
@@ -15,9 +15,9 @@
-
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -32,25 +32,25 @@
spring-boot-starter-aop
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-dao-redis-jackson
- ${sa-token-version}
+ ${sa-token.version}
diff --git a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/SaTokenConfigure.java b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/SaTokenConfigure.java
index a4a4995e..00ce6931 100644
--- a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/SaTokenConfigure.java
+++ b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/SaTokenConfigure.java
@@ -8,6 +8,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.filter.SaServletFilter;
import cn.dev33.satoken.interceptor.SaInterceptor;
+import cn.dev33.satoken.router.SaHttpMethod;
+import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.util.SaResult;
@@ -51,7 +53,7 @@ public class SaTokenConfigure implements WebMvcConfigurer {
})
// 前置函数:在每次认证函数之前执行
- .setBeforeAuth(r -> {
+ .setBeforeAuth(obj -> {
// ---------- 设置一些安全响应头 ----------
SaHolder.getResponse()
// 服务器名称
@@ -62,7 +64,21 @@ public class SaTokenConfigure implements WebMvcConfigurer {
.setHeader("X-XSS-Protection", "1; mode=block")
// 禁用浏览器内容嗅探
.setHeader("X-Content-Type-Options", "nosniff")
- ;
+
+ // ---------- 设置跨域响应头 ----------
+ // 允许指定域访问跨域资源
+ .setHeader("Access-Control-Allow-Origin", "*")
+ // 允许所有请求方式
+ .setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE")
+ // 有效时间
+ .setHeader("Access-Control-Max-Age", "3600")
+ // 允许的header参数
+ .setHeader("Access-Control-Allow-Headers", "*");
+
+ // 如果是预检请求,则立即返回到前端
+ SaRouter.match(SaHttpMethod.OPTIONS)
+ .free(r -> System.out.println("--------OPTIONS预检请求,不做处理"))
+ .back();
})
;
}
diff --git a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/StpUserUtil.java b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/StpUserUtil.java
new file mode 100644
index 00000000..198e2225
--- /dev/null
+++ b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/StpUserUtil.java
@@ -0,0 +1,1032 @@
+package com.pj.satoken;
+
+import java.util.List;
+
+import org.springframework.stereotype.Component;
+
+import cn.dev33.satoken.SaManager;
+import cn.dev33.satoken.fun.SaFunction;
+import cn.dev33.satoken.session.SaSession;
+import cn.dev33.satoken.stp.SaLoginModel;
+import cn.dev33.satoken.stp.SaTokenInfo;
+import cn.dev33.satoken.stp.StpLogic;
+
+/**
+ * Sa-Token 权限认证工具类 (User版)
+ * @author kong
+ */
+@Component
+public class StpUserUtil {
+
+ private StpUserUtil() {}
+
+ /**
+ * 账号类型标识
+ */
+ public static final String TYPE = "user";
+
+ /**
+ * 底层的 StpLogic 对象
+ */
+ public static StpLogic stpLogic = new StpLogic(TYPE);
+
+ /**
+ * 获取当前 StpLogic 的账号类型
+ * @return See Note
+ */
+ public static String getLoginType(){
+ return stpLogic.getLoginType();
+ }
+
+ /**
+ * 重置 StpLogic 对象
+ *
1、更改此账户的 StpLogic 对象
+ *
2、put 到全局 StpLogic 集合中
+ *
+ * @param newStpLogic /
+ */
+ public static void setStpLogic(StpLogic newStpLogic) {
+ // 重置此账户的 StpLogic 对象
+ stpLogic = newStpLogic;
+
+ // 添加到全局 StpLogic 集合中
+ // 以便可以通过 SaManager.getStpLogic(type) 的方式来全局获取到这个 StpLogic
+ SaManager.putStpLogic(newStpLogic);
+ }
+
+ /**
+ * 获取 StpLogic 对象
+ * @return /
+ */
+ public static StpLogic getStpLogic() {
+ return stpLogic;
+ }
+
+
+ // ------------------- 获取token 相关 -------------------
+
+ /**
+ * 返回token名称
+ * @return 此StpLogic的token名称
+ */
+ public static String getTokenName() {
+ return stpLogic.getTokenName();
+ }
+
+ /**
+ * 在当前会话写入当前TokenValue
+ * @param tokenValue token值
+ */
+ public static void setTokenValue(String tokenValue){
+ stpLogic.setTokenValue(tokenValue);
+ }
+
+ /**
+ * 在当前会话写入当前TokenValue
+ * @param tokenValue token值
+ * @param cookieTimeout Cookie存活时间(秒)
+ */
+ public static void setTokenValue(String tokenValue, int cookieTimeout){
+ stpLogic.setTokenValue(tokenValue, cookieTimeout);
+ }
+
+ /**
+ * 获取当前TokenValue
+ * @return 当前tokenValue
+ */
+ public static String getTokenValue() {
+ return stpLogic.getTokenValue();
+ }
+
+ /**
+ * 获取当前TokenValue (不裁剪前缀)
+ * @return /
+ */
+ public static String getTokenValueNotCut(){
+ return stpLogic.getTokenValueNotCut();
+ }
+
+ /**
+ * 获取当前会话的Token信息
+ * @return token信息
+ */
+ public static SaTokenInfo getTokenInfo() {
+ return stpLogic.getTokenInfo();
+ }
+
+
+ // ------------------- 登录相关操作 -------------------
+
+ // --- 登录
+
+ /**
+ * 会话登录
+ * @param id 账号id,建议的类型:(long | int | String)
+ */
+ public static void login(Object id) {
+ stpLogic.login(id);
+ }
+
+ /**
+ * 会话登录,并指定登录设备类型
+ * @param id 账号id,建议的类型:(long | int | String)
+ * @param device 设备类型
+ */
+ public static void login(Object id, String device) {
+ stpLogic.login(id, device);
+ }
+
+ /**
+ * 会话登录,并指定是否 [记住我]
+ *
+ * @param id 账号id,建议的类型:(long | int | String)
+ * @param isLastingCookie 是否为持久Cookie
+ */
+ public static void login(Object id, boolean isLastingCookie) {
+ stpLogic.login(id, isLastingCookie);
+ }
+
+ /**
+ * 会话登录,并指定此次登录token的有效期, 单位:秒
+ *
+ * @param id 账号id,建议的类型:(long | int | String)
+ * @param timeout 此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值)
+ */
+ public static void login(Object id, long timeout) {
+ stpLogic.login(id, timeout);
+ }
+
+ /**
+ * 会话登录,并指定所有登录参数Model
+ *
+ * @param id 登录id,建议的类型:(long | int | String)
+ * @param loginModel 此次登录的参数Model
+ */
+ public static void login(Object id, SaLoginModel loginModel) {
+ stpLogic.login(id, loginModel);
+ }
+
+ /**
+ * 创建指定账号id的登录会话
+ * @param id 登录id,建议的类型:(long | int | String)
+ * @return 返回会话令牌
+ */
+ public static String createLoginSession(Object id) {
+ return stpLogic.createLoginSession(id);
+ }
+
+ /**
+ * 创建指定账号id的登录会话
+ * @param id 登录id,建议的类型:(long | int | String)
+ * @param loginModel 此次登录的参数Model
+ * @return 返回会话令牌
+ */
+ public static String createLoginSession(Object id, SaLoginModel loginModel) {
+ return stpLogic.createLoginSession(id, loginModel);
+ }
+
+ // --- 注销
+
+ /**
+ * 会话注销
+ */
+ public static void logout() {
+ stpLogic.logout();
+ }
+
+ /**
+ * 会话注销,根据账号id
+ * @param loginId 账号id
+ */
+ public static void logout(Object loginId) {
+ stpLogic.logout(loginId);
+ }
+
+ /**
+ * 会话注销,根据账号id 和 设备类型
+ *
+ * @param loginId 账号id
+ * @param device 设备类型 (填null代表注销所有设备类型)
+ */
+ public static void logout(Object loginId, String device) {
+ stpLogic.logout(loginId, device);
+ }
+
+ /**
+ * 会话注销,根据指定 Token
+ *
+ * @param tokenValue 指定token
+ */
+ public static void logoutByTokenValue(String tokenValue) {
+ stpLogic.logoutByTokenValue(tokenValue);
+ }
+
+ /**
+ * 踢人下线,根据账号id
+ * 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5
+ *
+ * @param loginId 账号id
+ */
+ public static void kickout(Object loginId) {
+ stpLogic.kickout(loginId);
+ }
+
+ /**
+ * 踢人下线,根据账号id 和 设备类型
+ * 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5
+ *
+ * @param loginId 账号id
+ * @param device 设备类型 (填null代表踢出所有设备类型)
+ */
+ public static void kickout(Object loginId, String device) {
+ stpLogic.kickout(loginId, device);
+ }
+
+ /**
+ * 踢人下线,根据指定 Token
+ * 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5
+ *
+ * @param tokenValue 指定token
+ */
+ public static void kickoutByTokenValue(String tokenValue) {
+ stpLogic.kickoutByTokenValue(tokenValue);
+ }
+
+ /**
+ * 顶人下线,根据账号id 和 设备类型
+ * 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-4
+ *
+ * @param loginId 账号id
+ * @param device 设备类型 (填null代表顶替所有设备类型)
+ */
+ public static void replaced(Object loginId, String device) {
+ stpLogic.replaced(loginId, device);
+ }
+
+
+ // 查询相关
+
+ /**
+ * 当前会话是否已经登录
+ * @return 是否已登录
+ */
+ public static boolean isLogin() {
+ return stpLogic.isLogin();
+ }
+
+ /**
+ * 检验当前会话是否已经登录,如未登录,则抛出异常
+ */
+ public static void checkLogin() {
+ stpLogic.checkLogin();
+ }
+
+ /**
+ * 获取当前会话账号id, 如果未登录,则抛出异常
+ * @return 账号id
+ */
+ public static Object getLoginId() {
+ return stpLogic.getLoginId();
+ }
+
+ /**
+ * 获取当前会话账号id, 如果未登录,则返回默认值
+ * @param 返回类型
+ * @param defaultValue 默认值
+ * @return 登录id
+ */
+ public static T getLoginId(T defaultValue) {
+ return stpLogic.getLoginId(defaultValue);
+ }
+
+ /**
+ * 获取当前会话账号id, 如果未登录,则返回null
+ * @return 账号id
+ */
+ public static Object getLoginIdDefaultNull() {
+ return stpLogic.getLoginIdDefaultNull();
+ }
+
+ /**
+ * 获取当前会话账号id, 并转换为String类型
+ * @return 账号id
+ */
+ public static String getLoginIdAsString() {
+ return stpLogic.getLoginIdAsString();
+ }
+
+ /**
+ * 获取当前会话账号id, 并转换为int类型
+ * @return 账号id
+ */
+ public static int getLoginIdAsInt() {
+ return stpLogic.getLoginIdAsInt();
+ }
+
+ /**
+ * 获取当前会话账号id, 并转换为long类型
+ * @return 账号id
+ */
+ public static long getLoginIdAsLong() {
+ return stpLogic.getLoginIdAsLong();
+ }
+
+ /**
+ * 获取指定Token对应的账号id,如果未登录,则返回 null
+ * @param tokenValue token
+ * @return 账号id
+ */
+ public static Object getLoginIdByToken(String tokenValue) {
+ return stpLogic.getLoginIdByToken(tokenValue);
+ }
+
+ /**
+ * 获取当前 Token 的扩展信息(此函数只在jwt模式下生效)
+ * @param key 键值
+ * @return 对应的扩展数据
+ */
+ public static Object getExtra(String key) {
+ return stpLogic.getExtra(key);
+ }
+
+ /**
+ * 获取指定 Token 的扩展信息(此函数只在jwt模式下生效)
+ * @param tokenValue 指定的 Token 值
+ * @param key 键值
+ * @return 对应的扩展数据
+ */
+ public static Object getExtra(String tokenValue, String key) {
+ return stpLogic.getExtra(tokenValue, key);
+ }
+
+
+ // ------------------- User-Session 相关 -------------------
+
+ /**
+ * 获取指定账号id的Session, 如果Session尚未创建,isCreate=是否新建并返回
+ * @param loginId 账号id
+ * @param isCreate 是否新建
+ * @return Session对象
+ */
+ public static SaSession getSessionByLoginId(Object loginId, boolean isCreate) {
+ return stpLogic.getSessionByLoginId(loginId, isCreate);
+ }
+
+ /**
+ * 获取指定key的Session, 如果Session尚未创建,则返回null
+ * @param sessionId SessionId
+ * @return Session对象
+ */
+ public static SaSession getSessionBySessionId(String sessionId) {
+ return stpLogic.getSessionBySessionId(sessionId);
+ }
+
+ /**
+ * 获取指定账号id的Session,如果Session尚未创建,则新建并返回
+ * @param loginId 账号id
+ * @return Session对象
+ */
+ public static SaSession getSessionByLoginId(Object loginId) {
+ return stpLogic.getSessionByLoginId(loginId);
+ }
+
+ /**
+ * 获取当前会话的Session, 如果Session尚未创建,isCreate=是否新建并返回
+ * @param isCreate 是否新建
+ * @return Session对象
+ */
+ public static SaSession getSession(boolean isCreate) {
+ return stpLogic.getSession(isCreate);
+ }
+
+ /**
+ * 获取当前会话的Session,如果Session尚未创建,则新建并返回
+ * @return Session对象
+ */
+ public static SaSession getSession() {
+ return stpLogic.getSession();
+ }
+
+
+ // ------------------- Token-Session 相关 -------------------
+
+ /**
+ * 获取指定Token-Session,如果Session尚未创建,则新建并返回
+ * @param tokenValue Token值
+ * @return Session对象
+ */
+ public static SaSession getTokenSessionByToken(String tokenValue) {
+ return stpLogic.getTokenSessionByToken(tokenValue);
+ }
+
+ /**
+ * 获取当前Token-Session,如果Session尚未创建,则新建并返回
+ * @return Session对象
+ */
+ public static SaSession getTokenSession() {
+ return stpLogic.getTokenSession();
+ }
+
+ /**
+ * 获取当前匿名 Token-Session (可在未登录情况下使用的Token-Session)
+ * @return Token-Session 对象
+ */
+ public static SaSession getAnonTokenSession() {
+ return stpLogic.getAnonTokenSession();
+ }
+
+
+ // ------------------- [临时有效期] 验证相关 -------------------
+
+ /**
+ * 检查当前token 是否已经[临时过期],如果已经过期则抛出异常
+ */
+ public static void checkActivityTimeout() {
+ stpLogic.checkActivityTimeout();
+ }
+
+ /**
+ * 续签当前token:(将 [最后操作时间] 更新为当前时间戳)
+ * 请注意: 即使token已经 [临时过期] 也可续签成功,
+ * 如果此场景下需要提示续签失败,可在此之前调用 checkActivityTimeout() 强制检查是否过期即可
+ */
+ public static void updateLastActivityToNow() {
+ stpLogic.updateLastActivityToNow();
+ }
+
+
+ // ------------------- 过期时间相关 -------------------
+
+ /**
+ * 获取当前登录者的 token 剩余有效时间 (单位: 秒)
+ * @return token剩余有效时间
+ */
+ public static long getTokenTimeout() {
+ return stpLogic.getTokenTimeout();
+ }
+
+ /**
+ * 获取当前登录者的 User-Session 剩余有效时间 (单位: 秒)
+ * @return token剩余有效时间
+ */
+ public static long getSessionTimeout() {
+ return stpLogic.getSessionTimeout();
+ }
+
+ /**
+ * 获取当前 Token-Session 剩余有效时间 (单位: 秒)
+ * @return token剩余有效时间
+ */
+ public static long getTokenSessionTimeout() {
+ return stpLogic.getTokenSessionTimeout();
+ }
+
+ /**
+ * 获取当前 token [临时过期] 剩余有效时间 (单位: 秒)
+ * @return token [临时过期] 剩余有效时间
+ */
+ public static long getTokenActivityTimeout() {
+ return stpLogic.getTokenActivityTimeout();
+ }
+
+ /**
+ * 对当前 Token 的 timeout 值进行续期
+ * @param timeout 要修改成为的有效时间 (单位: 秒)
+ */
+ public static void renewTimeout(long timeout) {
+ stpLogic.renewTimeout(timeout);
+ }
+
+ /**
+ * 对指定 Token 的 timeout 值进行续期
+ * @param tokenValue 指定token
+ * @param timeout 要修改成为的有效时间 (单位: 秒)
+ */
+ public static void renewTimeout(String tokenValue, long timeout) {
+ stpLogic.renewTimeout(tokenValue, timeout);
+ }
+
+
+ // ------------------- 角色验证操作 -------------------
+
+ /**
+ * 获取:当前账号的角色集合
+ * @return /
+ */
+ public static List getRoleList() {
+ return stpLogic.getRoleList();
+ }
+
+ /**
+ * 获取:指定账号的角色集合
+ * @param loginId 指定账号id
+ * @return /
+ */
+ public static List getRoleList(Object loginId) {
+ return stpLogic.getRoleList(loginId);
+ }
+
+ /**
+ * 判断:当前账号是否拥有指定角色, 返回true或false
+ * @param role 角色标识
+ * @return 是否含有指定角色标识
+ */
+ public static boolean hasRole(String role) {
+ return stpLogic.hasRole(role);
+ }
+
+ /**
+ * 判断:指定账号是否含有指定角色标识, 返回true或false
+ * @param loginId 账号id
+ * @param role 角色标识
+ * @return 是否含有指定角色标识
+ */
+ public static boolean hasRole(Object loginId, String role) {
+ return stpLogic.hasRole(loginId, role);
+ }
+
+ /**
+ * 判断:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过]
+ * @param roleArray 角色标识数组
+ * @return true或false
+ */
+ public static boolean hasRoleAnd(String... roleArray){
+ return stpLogic.hasRoleAnd(roleArray);
+ }
+
+ /**
+ * 判断:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可]
+ * @param roleArray 角色标识数组
+ * @return true或false
+ */
+ public static boolean hasRoleOr(String... roleArray){
+ return stpLogic.hasRoleOr(roleArray);
+ }
+
+ /**
+ * 校验:当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException
+ * @param role 角色标识
+ */
+ public static void checkRole(String role) {
+ stpLogic.checkRole(role);
+ }
+
+ /**
+ * 校验:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过]
+ * @param roleArray 角色标识数组
+ */
+ public static void checkRoleAnd(String... roleArray){
+ stpLogic.checkRoleAnd(roleArray);
+ }
+
+ /**
+ * 校验:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可]
+ * @param roleArray 角色标识数组
+ */
+ public static void checkRoleOr(String... roleArray){
+ stpLogic.checkRoleOr(roleArray);
+ }
+
+
+ // ------------------- 权限验证操作 -------------------
+
+ /**
+ * 获取:当前账号的权限码集合
+ * @return /
+ */
+ public static List getPermissionList() {
+ return stpLogic.getPermissionList();
+ }
+
+ /**
+ * 获取:指定账号的权限码集合
+ * @param loginId 指定账号id
+ * @return /
+ */
+ public static List getPermissionList(Object loginId) {
+ return stpLogic.getPermissionList(loginId);
+ }
+
+ /**
+ * 判断:当前账号是否含有指定权限, 返回true或false
+ * @param permission 权限码
+ * @return 是否含有指定权限
+ */
+ public static boolean hasPermission(String permission) {
+ return stpLogic.hasPermission(permission);
+ }
+
+ /**
+ * 判断:指定账号id是否含有指定权限, 返回true或false
+ * @param loginId 账号id
+ * @param permission 权限码
+ * @return 是否含有指定权限
+ */
+ public static boolean hasPermission(Object loginId, String permission) {
+ return stpLogic.hasPermission(loginId, permission);
+ }
+
+ /**
+ * 判断:当前账号是否含有指定权限, [指定多个,必须全部具有]
+ * @param permissionArray 权限码数组
+ * @return true 或 false
+ */
+ public static boolean hasPermissionAnd(String... permissionArray){
+ return stpLogic.hasPermissionAnd(permissionArray);
+ }
+
+ /**
+ * 判断:当前账号是否含有指定权限 [指定多个,只要其一验证通过即可]
+ * @param permissionArray 权限码数组
+ * @return true 或 false
+ */
+ public static boolean hasPermissionOr(String... permissionArray){
+ return stpLogic.hasPermissionOr(permissionArray);
+ }
+
+ /**
+ * 校验:当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException
+ * @param permission 权限码
+ */
+ public static void checkPermission(String permission) {
+ stpLogic.checkPermission(permission);
+ }
+
+ /**
+ * 校验:当前账号是否含有指定权限 [指定多个,必须全部验证通过]
+ * @param permissionArray 权限码数组
+ */
+ public static void checkPermissionAnd(String... permissionArray) {
+ stpLogic.checkPermissionAnd(permissionArray);
+ }
+
+ /**
+ * 校验:当前账号是否含有指定权限 [指定多个,只要其一验证通过即可]
+ * @param permissionArray 权限码数组
+ */
+ public static void checkPermissionOr(String... permissionArray) {
+ stpLogic.checkPermissionOr(permissionArray);
+ }
+
+
+ // ------------------- id 反查token 相关操作 -------------------
+
+ /**
+ * 获取指定账号id的tokenValue
+ * 在配置为允许并发登录时,此方法只会返回队列的最后一个token,
+ * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId
+ * @param loginId 账号id
+ * @return token值
+ */
+ public static String getTokenValueByLoginId(Object loginId) {
+ return stpLogic.getTokenValueByLoginId(loginId);
+ }
+
+ /**
+ * 获取指定账号id指定设备类型端的tokenValue
+ *
在配置为允许并发登录时,此方法只会返回队列的最后一个token,
+ * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId
+ * @param loginId 账号id
+ * @param device 设备类型
+ * @return token值
+ */
+ public static String getTokenValueByLoginId(Object loginId, String device) {
+ return stpLogic.getTokenValueByLoginId(loginId, device);
+ }
+
+ /**
+ * 获取指定账号id的tokenValue集合
+ * @param loginId 账号id
+ * @return 此loginId的所有相关token
+ */
+ public static List getTokenValueListByLoginId(Object loginId) {
+ return stpLogic.getTokenValueListByLoginId(loginId);
+ }
+
+ /**
+ * 获取指定账号id指定设备类型端的tokenValue 集合
+ * @param loginId 账号id
+ * @param device 设备类型
+ * @return 此loginId的所有相关token
+ */
+ public static List getTokenValueListByLoginId(Object loginId, String device) {
+ return stpLogic.getTokenValueListByLoginId(loginId, device);
+ }
+
+ /**
+ * 返回当前会话的登录设备类型
+ * @return 当前令牌的登录设备类型
+ */
+ public static String getLoginDevice() {
+ return stpLogic.getLoginDevice();
+ }
+
+
+ // ------------------- 会话管理 -------------------
+
+ /**
+ * 根据条件查询Token
+ * @param keyword 关键字
+ * @param start 开始处索引 (-1代表查询所有)
+ * @param size 获取数量
+ * @param sortType 排序类型(true=正序,false=反序)
+ *
+ * @return token集合
+ */
+ public static List searchTokenValue(String keyword, int start, int size, boolean sortType) {
+ return stpLogic.searchTokenValue(keyword, start, size, sortType);
+ }
+
+ /**
+ * 根据条件查询SessionId
+ * @param keyword 关键字
+ * @param start 开始处索引 (-1代表查询所有)
+ * @param size 获取数量
+ * @param sortType 排序类型(true=正序,false=反序)
+ *
+ * @return sessionId集合
+ */
+ public static List searchSessionId(String keyword, int start, int size, boolean sortType) {
+ return stpLogic.searchSessionId(keyword, start, size, sortType);
+ }
+
+ /**
+ * 根据条件查询Token专属Session的Id
+ * @param keyword 关键字
+ * @param start 开始处索引 (-1代表查询所有)
+ * @param size 获取数量
+ * @param sortType 排序类型(true=正序,false=反序)
+ *
+ * @return sessionId集合
+ */
+ public static List searchTokenSessionId(String keyword, int start, int size, boolean sortType) {
+ return stpLogic.searchTokenSessionId(keyword, start, size, sortType);
+ }
+
+
+ // ------------------- 账号封禁 -------------------
+
+ /**
+ * 封禁:指定账号
+ * 此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id)
+ *
+ * @param loginId 指定账号id
+ * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
+ */
+ public static void disable(Object loginId, long time) {
+ stpLogic.disable(loginId, time);
+ }
+
+ /**
+ * 判断:指定账号是否已被封禁 (true=已被封禁, false=未被封禁)
+ *
+ * @param loginId 账号id
+ * @return /
+ */
+ public static boolean isDisable(Object loginId) {
+ return stpLogic.isDisable(loginId);
+ }
+
+ /**
+ * 校验:指定账号是否已被封禁,如果被封禁则抛出异常
+ * @param loginId 账号id
+ */
+ public static void checkDisable(Object loginId) {
+ stpLogic.checkDisable(loginId);
+ }
+
+ /**
+ * 获取:指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
+ * @param loginId 账号id
+ * @return /
+ */
+ public static long getDisableTime(Object loginId) {
+ return stpLogic.getDisableTime(loginId);
+ }
+
+ /**
+ * 解封:指定账号
+ * @param loginId 账号id
+ */
+ public static void untieDisable(Object loginId) {
+ stpLogic.untieDisable(loginId);
+ }
+
+
+ // ------------------- 分类封禁 -------------------
+
+ /**
+ * 封禁:指定账号的指定服务
+ *
此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id)
+ * @param loginId 指定账号id
+ * @param service 指定服务
+ * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
+ */
+ public static void disable(Object loginId, String service, long time) {
+ stpLogic.disable(loginId, service, time);
+ }
+
+ /**
+ * 判断:指定账号的指定服务 是否已被封禁 (true=已被封禁, false=未被封禁)
+ * @param loginId 账号id
+ * @param service 指定服务
+ * @return /
+ */
+ public static boolean isDisable(Object loginId, String service) {
+ return stpLogic.isDisable(loginId, service);
+ }
+
+ /**
+ * 校验:指定账号 指定服务 是否已被封禁,如果被封禁则抛出异常
+ * @param loginId 账号id
+ * @param services 指定服务,可以指定多个
+ */
+ public static void checkDisable(Object loginId, String... services) {
+ stpLogic.checkDisable(loginId, services);
+ }
+
+ /**
+ * 获取:指定账号 指定服务 剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
+ * @param loginId 账号id
+ * @param service 指定服务
+ * @return see note
+ */
+ public static long getDisableTime(Object loginId, String service) {
+ return stpLogic.getDisableTime(loginId, service);
+ }
+
+ /**
+ * 解封:指定账号、指定服务
+ * @param loginId 账号id
+ * @param services 指定服务,可以指定多个
+ */
+ public static void untieDisable(Object loginId, String... services) {
+ stpLogic.untieDisable(loginId, services);
+ }
+
+
+ // ------------------- 阶梯封禁 -------------------
+
+ /**
+ * 封禁:指定账号,并指定封禁等级
+ * @param loginId 指定账号id
+ * @param level 指定封禁等级
+ * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
+ */
+ public static void disableLevel(Object loginId, int level, long time) {
+ stpLogic.disableLevel(loginId, level, time);
+ }
+
+ /**
+ * 封禁:指定账号的指定服务,并指定封禁等级
+ * @param loginId 指定账号id
+ * @param service 指定封禁服务
+ * @param level 指定封禁等级
+ * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
+ */
+ public static void disableLevel(Object loginId, String service, int level, long time) {
+ stpLogic.disableLevel(loginId, service, level, time);
+ }
+
+ /**
+ * 判断:指定账号是否已被封禁到指定等级
+ *
+ * @param loginId 指定账号id
+ * @param level 指定封禁等级
+ * @return /
+ */
+ public static boolean isDisableLevel(Object loginId, int level) {
+ return stpLogic.isDisableLevel(loginId, level);
+ }
+
+ /**
+ * 判断:指定账号的指定服务,是否已被封禁到指定等级
+ *
+ * @param loginId 指定账号id
+ * @param service 指定封禁服务
+ * @param level 指定封禁等级
+ * @return /
+ */
+ public static boolean isDisableLevel(Object loginId, String service, int level) {
+ return stpLogic.isDisableLevel(loginId, service, level);
+ }
+
+ /**
+ * 校验:指定账号是否已被封禁到指定等级(如果已经达到,则抛出异常)
+ *
+ * @param loginId 指定账号id
+ * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常)
+ */
+ public static void checkDisableLevel(Object loginId, int level) {
+ stpLogic.checkDisableLevel(loginId, level);
+ }
+
+ /**
+ * 校验:指定账号的指定服务,是否已被封禁到指定等级(如果已经达到,则抛出异常)
+ *
+ * @param loginId 指定账号id
+ * @param service 指定封禁服务
+ * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常)
+ */
+ public static void checkDisableLevel(Object loginId, String service, int level) {
+ stpLogic.checkDisableLevel(loginId, service, level);
+ }
+
+ /**
+ * 获取:指定账号被封禁的等级,如果未被封禁则返回-2
+ *
+ * @param loginId 指定账号id
+ * @return /
+ */
+ public static int getDisableLevel(Object loginId) {
+ return stpLogic.getDisableLevel(loginId);
+ }
+
+ /**
+ * 获取:指定账号的 指定服务 被封禁的等级,如果未被封禁则返回-2
+ *
+ * @param loginId 指定账号id
+ * @param service 指定封禁服务
+ * @return /
+ */
+ public static int getDisableLevel(Object loginId, String service) {
+ return stpLogic.getDisableLevel(loginId, service);
+ }
+
+
+ // ------------------- 身份切换 -------------------
+
+ /**
+ * 临时切换身份为指定账号id
+ * @param loginId 指定loginId
+ */
+ public static void switchTo(Object loginId) {
+ stpLogic.switchTo(loginId);
+ }
+
+ /**
+ * 结束临时切换身份
+ */
+ public static void endSwitch() {
+ stpLogic.endSwitch();
+ }
+
+ /**
+ * 当前是否正处于[身份临时切换]中
+ * @return 是否正处于[身份临时切换]中
+ */
+ public static boolean isSwitch() {
+ return stpLogic.isSwitch();
+ }
+
+ /**
+ * 在一个代码段里方法内,临时切换身份为指定账号id
+ * @param loginId 指定账号id
+ * @param function 要执行的方法
+ */
+ public static void switchTo(Object loginId, SaFunction function) {
+ stpLogic.switchTo(loginId, function);
+ }
+
+
+ // ------------------- 二级认证 -------------------
+
+ /**
+ * 在当前会话 开启二级认证
+ * @param safeTime 维持时间 (单位: 秒)
+ */
+ public static void openSafe(long safeTime) {
+ stpLogic.openSafe(safeTime);
+ }
+
+ /**
+ * 当前会话 是否处于二级认证时间内
+ * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时
+ */
+ public static boolean isSafe() {
+ return stpLogic.isSafe();
+ }
+
+ /**
+ * 检查当前会话是否已通过二级认证,如未通过则抛出异常
+ */
+ public static void checkSafe() {
+ stpLogic.checkSafe();
+ }
+
+ /**
+ * 获取当前会话的二级认证剩余有效时间 (单位: 秒, 返回-2代表尚未通过二级认证)
+ * @return 剩余有效时间
+ */
+ public static long getSafeTime() {
+ return stpLogic.getSafeTime();
+ }
+
+ /**
+ * 在当前会话 结束二级认证
+ */
+ public static void closeSafe() {
+ stpLogic.closeSafe();
+ }
+
+}
diff --git a/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml
index cb63067a..b38fe0af 100644
--- a/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml
+++ b/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml
@@ -2,7 +2,7 @@
server:
port: 8081
-# sa-token配置
+############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
sa-token:
# token名称 (同时也是cookie名称)
token-name: satoken
diff --git a/sa-token-demo/sa-token-demo-thymeleaf/pom.xml b/sa-token-demo/sa-token-demo-thymeleaf/pom.xml
index e11b5134..7b756a07 100644
--- a/sa-token-demo/sa-token-demo-thymeleaf/pom.xml
+++ b/sa-token-demo/sa-token-demo-thymeleaf/pom.xml
@@ -14,9 +14,9 @@
-
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -37,18 +37,18 @@
spring-boot-starter-thymeleaf
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
cn.dev33
sa-token-dialect-thymeleaf
- ${sa-token-version}
+ ${sa-token.version}
diff --git a/sa-token-demo/sa-token-demo-webflux/pom.xml b/sa-token-demo/sa-token-demo-webflux/pom.xml
index 784bb3e0..3f1414b4 100644
--- a/sa-token-demo/sa-token-demo-webflux/pom.xml
+++ b/sa-token-demo/sa-token-demo-webflux/pom.xml
@@ -14,9 +14,9 @@
-
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -31,25 +31,25 @@
spring-boot-starter-aop
-
+
cn.dev33
sa-token-reactor-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
diff --git a/sa-token-demo/sa-token-demo-websocket-spring/pom.xml b/sa-token-demo/sa-token-demo-websocket-spring/pom.xml
index e9f4a5e4..2be2ce3c 100644
--- a/sa-token-demo/sa-token-demo-websocket-spring/pom.xml
+++ b/sa-token-demo/sa-token-demo-websocket-spring/pom.xml
@@ -15,9 +15,9 @@
-
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -38,18 +38,18 @@
spring-boot-starter-websocket
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
+
- 1.31.1.temp
+ 1.31.1.temp
@@ -38,18 +38,18 @@
spring-boot-starter-websocket
-
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa-token.version}
+
+
+
+
+
@@ -232,7 +238,7 @@
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
- hm.src = "https://hm.baidu.com/hm.js?77d7418dd845f98ba1cfee8596eeee3f";
+ hm.src = "https://hm.baidu.com/hm.js?35ad501304eae758ac6139a22a9830f5";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
@@ -240,8 +246,8 @@
diff --git a/sa-token-doc/fun/curr-domain.md b/sa-token-doc/fun/curr-domain.md
index f7d9382b..1a7c2184 100644
--- a/sa-token-doc/fun/curr-domain.md
+++ b/sa-token-doc/fun/curr-domain.md
@@ -64,10 +64,19 @@ public class CustomSaTokenContextForSpring extends SaTokenContextForSpring {
### 方案二:直接在yml中配置当前项目的网络访问地址
在 `application.yml` 中增加配置:
-``` yml
+
+
+
+``` yaml
sa-token:
# 配置当前项目的网络访问地址
curr-domain: http://local.dev33.cn:8902/api
```
+
+``` properties
+# 配置当前项目的网络访问地址
+sa-token.curr-domain=http://local.dev33.cn:8902/api
+```
+
即可避免路由转发过程中丢失 uri 的问题
diff --git a/sa-token-doc/fun/plugin-dev.md b/sa-token-doc/fun/plugin-dev.md
index 650b34fa..98a4d54c 100644
--- a/sa-token-doc/fun/plugin-dev.md
+++ b/sa-token-doc/fun/plugin-dev.md
@@ -96,8 +96,8 @@ SaTokenContext 是对接不同框架的上下文接口,注入流程和第二
| 插件 | 功能 | 状态 |
| :-------- | :-------- | :-------- |
-| sa-token-solon-starter | Sa-Token 与 Solon 的整合 | 已完成 |
-| sa-token-jfinal-starter | Sa-Token 与 JFinal 的整合 | 待开发 |
+| sa-token-solon-starter | Sa-Token 与 Solon 的整合 | 已完成 |
+| sa-token-jfinal-starter | Sa-Token 与 JFinal 的整合 | 已完成 |
| sa-token-hasor-starter | Sa-Token 与 Hasor 的整合 | 待开发 |
##### 标签方言:
diff --git a/sa-token-doc/fun/sa-token-context.md b/sa-token-doc/fun/sa-token-context.md
index a16f61e4..ae8803aa 100644
--- a/sa-token-doc/fun/sa-token-context.md
+++ b/sa-token-doc/fun/sa-token-context.md
@@ -71,7 +71,9 @@ public interface SaTokenContext {
先别着急动手,如果你的 Web 框架是基于 Servlet 规范开发的,那么 Sa-Token 已经为你封装好了三个 Model 接口的实现,你要做的就是引入 `sa-token-servlet`包即可:
-``` xml
+
+
+``` xml
cn.dev33
@@ -79,6 +81,13 @@ public interface SaTokenContext {
${sa.top.version}
```
+
+``` gradle
+// Sa-Token 权限认证(ServletAPI 集成包)
+implementation 'cn.dev33:sa-token-servlet:${sa.top.version}'
+```
+
+
如果你的 Web 框架不是基于 Servlet 规范,那么你就需要手动实现这三个 Model 接口,我们可以参考 `sa-token-servlet` 是怎样实现的:
[SaRequestForServlet.java](https://gitee.com/dromara/sa-token/blob/master/sa-token-starter/sa-token-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaRequestForServlet.java)、
diff --git a/sa-token-doc/fun/token-timeout.md b/sa-token-doc/fun/token-timeout.md
index 2cef7d86..9faa9cb2 100644
--- a/sa-token-doc/fun/token-timeout.md
+++ b/sa-token-doc/fun/token-timeout.md
@@ -4,13 +4,24 @@
Sa-Token 提供两种Token自动过期策略,分别是`timeout`与`activity-timeout`,配置方法如下:
-``` yml
+
+
+``` yaml
sa-token:
# Token 有效期,单位:秒,默认30天, -1代表永不过期
timeout: 2592000
# Token 临时有效期 (指定时间内无操作就视为 Token 过期) 单位: 秒,-1代表不设限
activity-timeout: -1
```
+
+``` properties
+# Token 有效期,单位:秒,默认30天, -1代表永不过期
+sa-token.timeout=2592000
+# Token 临时有效期 (指定时间内无操作就视为 Token 过期) 单位: 秒,-1代表不设限
+sa-token.activity-timeout=-1
+```
+
+
两者的区别,可以通过下面的例子体现:
diff --git a/sa-token-doc/index.html b/sa-token-doc/index.html
index 4f62bf9f..b664779d 100644
--- a/sa-token-doc/index.html
+++ b/sa-token-doc/index.html
@@ -360,7 +360,7 @@
-
+
@@ -533,7 +533,7 @@
@@ -573,7 +573,7 @@
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
- hm.src = "https://hm.baidu.com/hm.js?77d7418dd845f98ba1cfee8596eeee3f";
+ hm.src = "https://hm.baidu.com/hm.js?35ad501304eae758ac6139a22a9830f5";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
@@ -655,8 +655,8 @@
diff --git a/sa-token-doc/micro/dcs-session.md b/sa-token-doc/micro/dcs-session.md
index 5851bfce..8dfe5a38 100644
--- a/sa-token-doc/micro/dcs-session.md
+++ b/sa-token-doc/micro/dcs-session.md
@@ -34,18 +34,27 @@
集成依赖示例:
-``` xml
-
+
+
+``` xml
+
- cn.dev33
- sa-token-dao-redis-jackson
- ${sa.top.version}
+ cn.dev33
+ sa-token-dao-redis-jackson
+ ${sa.top.version}
org.apache.commons
commons-pool2
```
+
+``` gradle
+// Sa-Token 整合 Redis (使用 jackson 序列化方式)
+implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}'
+implementation 'org.apache.commons:commons-pool2'
+```
+
详细参考:[集成 Redis](/up/integ-redis)
diff --git a/sa-token-doc/micro/gateway-auth.md b/sa-token-doc/micro/gateway-auth.md
index 20689f74..aa9c8a01 100644
--- a/sa-token-doc/micro/gateway-auth.md
+++ b/sa-token-doc/micro/gateway-auth.md
@@ -14,24 +14,39 @@
首先,根据 [依赖引入说明](/micro/import-intro) 引入正确的依赖,以`[SpringCloud Gateway]`为例:
-``` xml
-
+
+
+``` xml
+
cn.dev33
sa-token-reactor-spring-boot-starter
${sa.top.version}
-
+
+
- cn.dev33
- sa-token-dao-redis-jackson
- ${sa.top.version}
+ cn.dev33
+ sa-token-dao-redis-jackson
+ ${sa.top.version}
org.apache.commons
commons-pool2
```
+
+``` gradle
+// Sa-Token 权限认证(Reactor响应式集成),在线文档:https://sa-token.cc
+implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}'
+
+// Sa-Token 整合 Redis (使用 jackson 序列化方式)
+implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}'
+implementation 'org.apache.commons:commons-pool2'
+```
+
+
+
注:Redis包是必须的,因为我们需要和各个服务通过Redis来同步数据
### 2、实现鉴权接口
@@ -78,7 +93,7 @@ public class SaTokenConfigure {
public SaReactorFilter getSaReactorFilter() {
return new SaReactorFilter()
// 拦截地址
- .addInclude("/**")
+ .addInclude("/**") /* 拦截全部path */
// 开放地址
.addExclude("/favicon.ico")
// 鉴权方法:每次访问进入
@@ -92,7 +107,7 @@ public class SaTokenConfigure {
SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods"));
SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));
- // ...
+ // 更多匹配 ... */
})
// 异常处理方法:每次setAuth函数出现异常时进入
.setError(e -> {
diff --git a/sa-token-doc/micro/id-token.md b/sa-token-doc/micro/id-token.md
index a55f9437..187e33a9 100644
--- a/sa-token-doc/micro/id-token.md
+++ b/sa-token-doc/micro/id-token.md
@@ -23,44 +23,70 @@ Sa-Token提供两种解决方案:
##### 1、引入依赖
在网关处引入的依赖为(此处以 SpringCloud Gateway 为例):
-``` xml
-
+
+
+``` xml
+
cn.dev33
sa-token-reactor-spring-boot-starter
${sa.top.version}
-
+
+
- cn.dev33
- sa-token-dao-redis-jackson
- ${sa.top.version}
+ cn.dev33
+ sa-token-dao-redis-jackson
+ ${sa.top.version}
org.apache.commons
commons-pool2
```
+
+``` gradle
+// Sa-Token 权限认证(Reactor响应式集成),在线文档:https://sa-token.cc
+implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}'
+
+// Sa-Token 整合 Redis (使用 jackson 序列化方式)
+implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}'
+implementation 'org.apache.commons:commons-pool2'
+```
+
在子服务引入的依赖为:
-``` xml
-
+
+
+``` xml
+
cn.dev33
sa-token-spring-boot-starter
${sa.top.version}
-
+
+
- cn.dev33
- sa-token-dao-redis-jackson
- ${sa.top.version}
+ cn.dev33
+ sa-token-dao-redis-jackson
+ ${sa.top.version}
org.apache.commons
commons-pool2
```
+
+``` gradle
+// Sa-Token 权限认证,在线文档:https://sa-token.cc
+implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
+
+// Sa-Token 整合 Redis (使用 jackson 序列化方式)
+implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}'
+implementation 'org.apache.commons:commons-pool2'
+```
+
##### 2、网关处添加Id-Token
diff --git a/sa-token-doc/micro/import-intro.md b/sa-token-doc/micro/import-intro.md
index 8dccf4cd..72389e39 100644
--- a/sa-token-doc/micro/import-intro.md
+++ b/sa-token-doc/micro/import-intro.md
@@ -7,25 +7,41 @@
> **在微服务架构中使用Sa-Token时,网关和内部服务要分开引入Sa-Token依赖(不要直接在顶级父pom中引入Sa-Token)**
-总体来讲,我们需要关注的依赖就是两个:`sa-token-spring-boot-starter` 和 `sa-token-reactor-spring-boot-starter`,
+总体来讲,我们需要关注的依赖就是两个:`sa-token-spring-boot-starter` 和 `sa-token-reactor-spring-boot-starter`:
-``` xml
-
+
+
+``` xml
+
- cn.dev33
- sa-token-spring-boot-starter
- ${sa.top.version}
+ cn.dev33
+ sa-token-spring-boot-starter
+ ${sa.top.version}
```
+
+``` gradle
+// Sa-Token 权限认证,在线文档:https://sa-token.cc
+implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
+```
+
-``` xml
-
+
+
+``` xml
+
- cn.dev33
- sa-token-reactor-spring-boot-starter
- ${sa.top.version}
+ cn.dev33
+ sa-token-reactor-spring-boot-starter
+ ${sa.top.version}
```
+
+``` gradle
+// Sa-Token 权限认证(Reactor响应式集成),在线文档:https://sa-token.cc
+implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}'
+```
+
至于怎么分辨我们需要引入哪个呢?这个要看你使用的基础框架:
@@ -40,18 +56,29 @@
注:切不可直接在一个项目里同时引入这两个依赖,否则会造成项目无法启动
另外,我们需要引入Redis集成包,因为我们的网关和子服务主要通过Redis来同步数据
-``` xml
-
+
+
+
+``` xml
+
- cn.dev33
- sa-token-dao-redis-jackson
- ${sa.top.version}
+ cn.dev33
+ sa-token-dao-redis-jackson
+ ${sa.top.version}
org.apache.commons
commons-pool2
```
+
+``` gradle
+// Sa-Token 整合 Redis (使用 jackson 序列化方式)
+implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}'
+implementation 'org.apache.commons:commons-pool2'
+```
+
+
详细参考:[集成 Redis](/up/integ-redis)
diff --git a/sa-token-doc/more/common-questions.md b/sa-token-doc/more/common-questions.md
index b6ffc07f..244bc2c9 100644
--- a/sa-token-doc/more/common-questions.md
+++ b/sa-token-doc/more/common-questions.md
@@ -146,14 +146,32 @@ registry.addInterceptor(new SaInterceptor(handler -> {
以上代码,当你未登录访问 `/user/doLogin` 时,会被第1条规则越过,然后被第2条拦下,校验登录,然后抛出异常:`NotLoginException:xxx`
+### Q:我在配置文件中加了一些关于 Sa-Token 的配置,但是没有生效。
+首先,有没有生效的最佳判断方式是,在main方法中加一个打印,看看打印出来的和你配置文件的一致吗:
+
+``` java
+@SpringBootApplication
+public class SaTokenApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(SaTokenApplication.class, args);
+ System.out.println("\n启动成功:Sa-Token配置如下:" + SaManager.getConfig());
+ }
+}
+```
+
+如果不一致,请排查:
+- 可能1:项目中还存在代码配置,而代码配置会覆盖 `application.yml` 中配置,详细参考:[框架配置](/use/config)。
+- 可能2:你的配置文件名字错误,SpringBoot 项目正常情况下配置文件名称应该是:`application.yml` 或 `application.properties`。
+
+
### Q:有时候我不加 Token 也可以通过鉴权,请问是怎么回事?
-可能1:你访问的这个接口,根本就没有鉴权的代码,所以可以安全的访问通过。
-可能2:可能是 Cookie 帮你自动提交了 Token,在浏览器或 Postman 中会自动维护Cookie模式,如不需要可以在配置文件:`is-read-cookie: false`,然后重启项目再测试一下。
+- 可能1:你访问的这个接口,根本就没有鉴权的代码,所以可以安全的访问通过。
+- 可能2:可能是 Cookie 帮你自动提交了 Token,在浏览器或 Postman 中会自动维护Cookie模式,如不需要可以在配置文件:`is-read-cookie: false`,然后重启项目再测试一下。
### Q:一个 User 对象存进 Session 后,再取出来时报错:无法从 User 类型转换成 User 类型?
-可能1:你的 User 类中途换了包名,导致存进去时和取出来时对不上,无法成功创建实例。
-可能2:你打开了代码热刷新模式,先存进去的对象,热刷新后再取出,会报错,关闭热刷新即可解决。
+- 可能1:你的 User 类中途换了包名,导致存进去时和取出来时对不上,无法成功创建实例。
+- 可能2:你打开了代码热刷新模式,先存进去的对象,热刷新后再取出,会报错,关闭热刷新即可解决。
### Q:我配置了 active-timeout 值,但是当我每次续签时 Redis 中的 ttl 并没有更新,是不是 bug 了?
diff --git a/sa-token-doc/oauth2/oauth2-server.md b/sa-token-doc/oauth2/oauth2-server.md
index a1e191b2..688d656d 100644
--- a/sa-token-doc/oauth2/oauth2-server.md
+++ b/sa-token-doc/oauth2/oauth2-server.md
@@ -13,8 +13,10 @@
### 2、引入依赖
创建SpringBoot项目 `sa-token-demo-oauth2-server`(不会的同学自行百度或参考仓库示例),添加pom依赖:
+
+
``` xml
-
+
cn.dev33
sa-token-spring-boot-starter
@@ -28,6 +30,17 @@
${sa.top.version}
```
+
+``` gradle
+// Sa-Token 权限认证,在线文档:https://sa-token.cc
+implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
+
+// Sa-Token-OAuth2.0 模块
+implementation 'cn.dev33:sa-token-oauth2:${sa.top.version}'
+```
+
+
+
### 3、开放服务
1、新建 `SaOAuth2TemplateImpl`
@@ -141,7 +154,7 @@ public class SaOAuth2ServerApplication {
1、由于暂未搭建Client端,我们可以使用Sa-Token官网作为重定向URL进行测试:
``` url
-http://sa-oauth-server.com:8001/oauth2/authorize?response_type=code&client_id=1001&redirect_uri=http://sa-token.dev33.cn/&scope=userinfo
+http://sa-oauth-server.com:8001/oauth2/authorize?response_type=code&client_id=1001&redirect_uri=https://sa-token.cc&scope=userinfo
```
2、由于首次访问,我们在OAuth-Server端暂未登录,会被转发到登录视图
diff --git a/sa-token-doc/plugin/alone-redis.md b/sa-token-doc/plugin/alone-redis.md
index 64e135c9..4a70d1b9 100644
--- a/sa-token-doc/plugin/alone-redis.md
+++ b/sa-token-doc/plugin/alone-redis.md
@@ -16,7 +16,9 @@ Sa-Token默认的Redis集成方式会把权限数据和业务缓存放在一起
### 1、首先引入Alone-Redis依赖
-``` xml
+
+
+``` xml
cn.dev33
@@ -24,11 +26,21 @@ Sa-Token默认的Redis集成方式会把权限数据和业务缓存放在一起
${sa.top.version}
```
+
+``` gradle
+// Sa-Token 整合 Redis (使用 jackson 序列化方式)
+implementation 'cn.dev33:sa-token-alone-redis:${sa.top.version}'
+```
+
### 2、然后在application.yml中增加配置
-``` yml
-# Sa-Token配置
+
+
+
+
+``` yaml
+# Sa-Token 配置
sa-token:
# Token名称
token-name: satoken
@@ -65,6 +77,45 @@ spring:
timeout: 10s
```
+
+``` properties
+############## Sa-Token 配置 ##############
+# Token名称
+sa-token.token-name=satoken
+# Token有效期
+sa-token.timeout=2592000
+# Token风格
+sa-token.token-style=uuid
+
+############## 配置 Sa-Token 单独使用的 Redis 连接 ##############
+# Redis数据库索引(默认为0)
+sa-token.alone-redis.database=2
+# Redis服务器地址
+sa-token.alone-redis.host=127.0.0.1
+# Redis服务器连接端口
+sa-token.alone-redis.port=6379
+# Redis服务器连接密码(默认为空)
+sa-token.alone-redis.password=
+# 连接超时时间
+sa-token.alone-redis.timeout=10s
+
+############## 配置业务使用的 Redis 连接 ##############
+# Redis数据库索引(默认为0)
+spring.redis.database=0
+# Redis服务器地址
+spring.redis.host=127.0.0.1
+# Redis服务器连接端口
+spring.redis.port=6379
+# Redis服务器连接密码(默认为空)
+spring.redis.password=
+# 连接超时时间
+spring.redis.timeout=10s
+
+```
+
+
+
+
具体可参考示例:[码云:application.yml](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-alone-redis/src/main/resources/application.yml)
@@ -102,3 +153,10 @@ public class TestController {

测试完毕!
+
+### 4、注意点
+目前 Sa-Token-Alone-Redis 仅对以下插件有 Redis 分离效果:
+- sa-token-dao-redis
+- sa-token-dao-redis-jackson
+- sa-token-dao-redis-fastjson
+- sa-token-dao-redis-fastjson2
\ No newline at end of file
diff --git a/sa-token-doc/plugin/aop-at.md b/sa-token-doc/plugin/aop-at.md
index 26b2339c..c96a1206 100644
--- a/sa-token-doc/plugin/aop-at.md
+++ b/sa-token-doc/plugin/aop-at.md
@@ -6,14 +6,22 @@
因此Sa-Token提供AOP插件,你只需在`pom.xml`里添加如下依赖,便可以在任意层级使用注解鉴权
+
+
``` xml
-
+
cn.dev33
sa-token-spring-aop
${sa.top.version}
```
+
+``` gradle
+// Sa-Token 整合 SpringAOP 实现注解鉴权
+implementation 'cn.dev33:sa-token-spring-aop:${sa.top.version}'
+```
+
#### 注意点:
diff --git a/sa-token-doc/plugin/dao-extend.md b/sa-token-doc/plugin/dao-extend.md
index 71a88407..0dc0750c 100644
--- a/sa-token-doc/plugin/dao-extend.md
+++ b/sa-token-doc/plugin/dao-extend.md
@@ -11,6 +11,7 @@
- sa-token-dao-redis-jackson:Redis集成包,使用 jackson 序列化方式。
- sa-token-dao-redisx:Redisx 集成包。
- sa-token-dao-redis-fastjson:Redis集成包,使用 fastjson 序列化方式。
+- sa-token-dao-redis-fastjson2:Redis集成包,使用 fastjson2 序列化方式。
有关 Redis 集成,详细参考:[集成Redis](/up/integ-redis),更多存储方式欢迎提交PR
diff --git a/sa-token-doc/plugin/dubbo-extend.md b/sa-token-doc/plugin/dubbo-extend.md
index 21a0cfa5..b67251fc 100644
--- a/sa-token-doc/plugin/dubbo-extend.md
+++ b/sa-token-doc/plugin/dubbo-extend.md
@@ -25,7 +25,9 @@ RPC 模式的调用,可以让我们像调用本地方法一样完成服务通
在项目已经引入 Dubbo 的基础上,继续添加依赖(Consumer 端和 Provider 端都需要引入):
-``` xml
+
+
+``` xml
cn.dev33
@@ -33,6 +35,13 @@ RPC 模式的调用,可以让我们像调用本地方法一样完成服务通
${sa.top.version}
```
+
+``` gradle
+// Sa-Token 整合 Dubbo
+implementation 'cn.dev33:sa-token-context-dubbo:${sa.top.version}'
+```
+
+
然后我们就可以愉快的做到以下事情:
@@ -64,11 +73,19 @@ RPC 模式的调用,可以让我们像调用本地方法一样完成服务通
直接在 `application.yml` 配置即可:
-``` yml
+
+
+``` yaml
sa-token:
# 打开 RPC 调用鉴权
check-id-token: true
```
+
+``` properties
+# 打开 RPC 调用鉴权
+sa-token.check-id-token=true
+```
+
##### 方式二、自建 Dubbo 过滤器校验
diff --git a/sa-token-doc/plugin/grpc-extend.md b/sa-token-doc/plugin/grpc-extend.md
index 8e3d0e96..84d73506 100644
--- a/sa-token-doc/plugin/grpc-extend.md
+++ b/sa-token-doc/plugin/grpc-extend.md
@@ -19,7 +19,9 @@
### 引入插件
需要springboot环境,添加依赖(调用端和被调用端都需要引入):
-``` xml
+
+
+``` xml
cn.dev33
@@ -27,13 +29,28 @@
${sa.top.version}
```
+
+``` gradle
+// Sa-Token 整合 grpc
+implementation 'cn.dev33:sa-token-context-grpc:${sa.top.version}'
+```
+
+
---
### 开启id-token校验:
直接在 `application.yml` 配置即可:
-``` yml
+
+
+``` yaml
sa-token:
# 打开 RPC 调用鉴权
check-id-token: true
-```
\ No newline at end of file
+```
+
+``` properties
+# 打开 RPC 调用鉴权
+sa-token.check-id-token=true
+```
+
\ No newline at end of file
diff --git a/sa-token-doc/plugin/jwt-extend.md b/sa-token-doc/plugin/jwt-extend.md
index acc0b114..3b01727d 100644
--- a/sa-token-doc/plugin/jwt-extend.md
+++ b/sa-token-doc/plugin/jwt-extend.md
@@ -7,7 +7,9 @@
### 1、引入依赖
首先在项目已经引入 Sa-Token 的基础上,继续添加:
-``` xml
+
+
+``` xml
cn.dev33
@@ -15,15 +17,33 @@
${sa.top.version}
```
-> 注意: sa-token-jwt 显式依赖 hutool-all 5.7.14 版本,意味着:你的项目中要么不引入 Hutool,要么引入版本 >= 5.7.14 的 Hutool 版本
+
+``` gradle
+// Sa-Token 整合 jwt
+implementation 'cn.dev33:sa-token-jwt:${sa.top.version}'
+```
+
+
+
+> 注意: sa-token-jwt 显式依赖 hutool-jwt 5.7.14 版本,意味着:你的项目中要么不引入 Hutool,要么引入版本 >= 5.7.14 的 Hutool 版本
### 2、配置秘钥
在 `application.yml` 配置文件中配置 jwt 生成秘钥:
-``` yml
+
+
+
+``` yaml
sa-token:
# jwt秘钥
jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk
```
+
+``` properties
+# jwt秘钥
+sa-token.jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk
+```
+
+
注:为了安全起见请不要直接复制官网示例这个字符串(随便按几个字符就好了)
diff --git a/sa-token-doc/plugin/quick-login.md b/sa-token-doc/plugin/quick-login.md
index 0997e814..a2a937ce 100644
--- a/sa-token-doc/plugin/quick-login.md
+++ b/sa-token-doc/plugin/quick-login.md
@@ -44,6 +44,9 @@ Sa-Token-Quick-Login的定位是这样的场景:你的项目需要一个登录
首先我们需要创建一个SpringBoot的demo项目,比如:`sa-token-demo-quick-login`
##### 1、添加pom依赖
+
+
+
``` xml
@@ -52,6 +55,14 @@ Sa-Token-Quick-Login的定位是这样的场景:你的项目需要一个登录
${sa.top.version}
```
+
+``` gradle
+// Sa-Token-Quick-Login 插件
+implementation 'cn.dev33:sa-token-quick-login:${sa.top.version}'
+```
+
+
+
##### 2、启动类
``` java
@@ -98,7 +109,11 @@ public class TestController {
### 可配置信息
你可以在yml中添加如下配置 (所有配置都是可选的)
-``` java
+
+
+
+
+``` yaml
# Sa-Token-Quick-Login 配置
sa:
# 登录账号
@@ -116,9 +131,33 @@ sa:
# 指定拦截路径
# include: /**
# 指定排除路径
- # exclude: /sss,/fff
+ # exclude: /1.jpg
```
+
+``` properties
+####### Sa-Token-Quick-Login 配置 #######
+# 登录账号
+sa.name=sa
+# 登录密码
+sa.pwd=123456
+# 是否自动随机生成账号密码 (此项为true时, name与pwd失效)
+sa.auto=false
+# 是否开启全局认证(关闭后将不再强行拦截)
+sa.auth=true
+# 登录页标题
+sa.title=Sa-Token 登录
+# 是否显示底部版权信息
+sa.copr=true
+# 指定拦截路径
+# sa.include=/**
+# 指定排除路径
+# sa.exclude=/1.jpg
+```
+
+
+
+
**注:**示例源码在`/sa-token-demo/sa-token-demo-quick-login`目录下,可结合源码查看学习
diff --git a/sa-token-doc/plugin/temp-token.md b/sa-token-doc/plugin/temp-token.md
index dd44ba22..13921c97 100644
--- a/sa-token-doc/plugin/temp-token.md
+++ b/sa-token-doc/plugin/temp-token.md
@@ -59,6 +59,8 @@ SaTempUtil.deleteToken(token);
**[sa-token-temp]** 模块允许以JWT作为逻辑内核完成工作,你只需要引入以下依赖,所有上层API保持不变
+
+
``` xml
cn.dev33
@@ -66,6 +68,12 @@ SaTempUtil.deleteToken(token);
${sa.top.version}
```
+
+``` gradle
+implementation 'cn.dev33:sa-token-temp-jwt:${sa.top.version}'
+```
+
+
并在配置文件中配置上jwt秘钥 **`(必填!)`**
``` java
diff --git a/sa-token-doc/plugin/thymeleaf-extend.md b/sa-token-doc/plugin/thymeleaf-extend.md
index e33a7dd4..ae8f00fd 100644
--- a/sa-token-doc/plugin/thymeleaf-extend.md
+++ b/sa-token-doc/plugin/thymeleaf-extend.md
@@ -7,7 +7,9 @@
### 1、引入依赖
首先我们确保项目已经引入 Thymeleaf 依赖,然后在此基础上继续添加:
-``` xml
+
+
+``` xml
cn.dev33
@@ -15,6 +17,13 @@
${sa.top.version}
```
+
+``` gradle
+// 在 thymeleaf 标签中使用 Sa-Token
+implementation 'cn.dev33:sa-token-dialect-thymeleaf:${sa.top.version}'
+```
+
+
### 2、注册标签方言对象
diff --git a/sa-token-doc/sso/sso-check-domain.md b/sa-token-doc/sso/sso-check-domain.md
index 686c9bc2..96caff48 100644
--- a/sa-token-doc/sso/sso-check-domain.md
+++ b/sa-token-doc/sso/sso-check-domain.md
@@ -21,7 +21,23 @@
造成此漏洞的直接原因就是SSO-Server认证中心没有对 `redirect地址` 进行任何的限制,防范的方法也很简单,就是对`redirect参数`进行校验,如果其不在指定的URL列表中时,拒绝下放ticket
-我们将其配置为一个具体的URL:`allow-url=http://sa-sso-client1.com:9001/sso/login`,再次访问上述连接:
+我们将其配置为一个具体的URL:
+
+
+``` yaml
+sa-token:
+ sso:
+ # 配置允许单点登录的 url
+ allow-url: http://sa-sso-client1.com:9001/sso/login
+```
+
+``` properties
+# 配置允许单点登录的 url
+sa-token.sso.allow-url=http://sa-sso-client1.com:9001/sso/login
+```
+
+
+再次访问上述链接:

diff --git a/sa-token-doc/sso/sso-h5.md b/sa-token-doc/sso/sso-h5.md
index 4b2ca2ee..e779ab7e 100644
--- a/sa-token-doc/sso/sso-h5.md
+++ b/sa-token-doc/sso/sso-h5.md
@@ -118,12 +118,21 @@ public class H5Controller {
复制上述地址,将其配置到 Client 端的 yml 配置文件中,例如:
-``` yml
-sa-token:
- sso:
+
+
+``` yaml
+sa-token:
+ sso:
# SSO-Server端 统一认证地址
auth-url: http://127.0.0.1:8848/sa-token-demo-sso-server-h5/sso-auth.html
```
+
+``` properties
+# SSO-Server端 统一认证地址
+sa-token.sso.auth-url=http://127.0.0.1:8848/sa-token-demo-sso-server-h5/sso-auth.html
+```
+
+
然后我们启动项目 `sa-token-demo-sso-server` 与 `sa-token-demo-sso2-client`,按照之前的测试步骤访问:
[http://sa-sso-client1.com:9001/](http://sa-sso-client1.com:9001/),即可以前后端分离模式完成 SSO-Server 端的授权登录。
diff --git a/sa-token-doc/sso/sso-server.md b/sa-token-doc/sso/sso-server.md
index b0a91c64..3814b582 100644
--- a/sa-token-doc/sso/sso-server.md
+++ b/sa-token-doc/sso/sso-server.md
@@ -9,8 +9,10 @@
### 1、添加依赖
创建 SpringBoot 项目 `sa-token-demo-sso-server`,引入依赖:
-``` xml
-
+
+
+``` xml
+
cn.dev33
sa-token-spring-boot-starter
@@ -48,6 +50,27 @@
3.1.1
```
+
+``` gradle
+// Sa-Token 权限认证,在线文档:https://sa-token.cc
+implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
+
+// Sa-Token 插件:整合SSO
+implementation 'cn.dev33:sa-token-sso:${sa.top.version}'
+
+// Sa-Token 整合 Redis (使用 jackson 序列化方式)
+implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}'
+implementation 'org.apache.commons:commons-pool2'
+
+// 视图引擎(在前后端不分离模式下提供视图支持)
+implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
+
+// Http请求工具(在模式三的单点注销功能下用到,如不需要可以注释掉)
+implementation 'com.ejlchina:okhttps:3.1.1'
+```
+
+
+
除了 `sa-token-spring-boot-starter` 和 `sa-token-sso` 以外,其它包都是可选的:
- 在 SSO 模式三时 Redis 相关包是可选的
@@ -133,6 +156,10 @@ public class GlobalExceptionHandler {
### 3、application.yml配置
+
+
+
+
``` yml
# 端口
server:
@@ -140,9 +167,9 @@ server:
# Sa-Token 配置
sa-token:
- # -------------- SSO-模式一相关配置 (非模式一不需要配置)
+ # ------- SSO-模式一相关配置 (非模式一不需要配置)
# cookie:
- # 配置Cookie作用域
+ # 配置 Cookie 作用域
# domain: stp.com
# ------- SSO-模式二相关配置
@@ -154,7 +181,7 @@ sa-token:
# 是否打开单点注销功能
is-slo: true
- # ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开) -------
+ # ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开)
# 是否打开模式三
isHttp: true
# 接口调用秘钥(用于SSO模式三的单点注销功能)
@@ -173,8 +200,46 @@ spring:
# Redis服务器连接密码(默认为空)
password:
```
+
+``` properties
+# 端口
+server.port=9000
-注意点:`allow-url`为了方便测试配置为`*`,线上生产环境一定要配置为详细URL地址 (之后的章节我们会详细阐述此配置项)
+################## Sa-Token 配置 ##################
+# ------- SSO-模式一相关配置 (非模式一不需要配置)
+# 配置 Cookie 作用域
+# sa-token.cookie.domain=stp.com
+
+# ------- SSO-模式二相关配置
+# Ticket有效期 (单位: 秒),默认五分钟
+sa-token.sso.ticket-timeout=300
+# 所有允许的授权回调地址
+sa-token.sso.allow-url=*
+# 是否打开单点注销功能
+sa-token.sso.is-slo=true
+
+# ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开)
+# 是否打开模式三
+sa-token.sso.isHttp=true
+# 接口调用秘钥(用于SSO模式三的单点注销功能)
+sa-token.sso.secretkey=kQwIOrYvnXmSDkwEiFngrKidMcdrgKor
+
+# ---- 除了以上配置项,你还需要为 Sa-Token 配置http请求处理器(文档有步骤说明)
+
+################## Redis配置 (SSO模式一和模式二使用Redis来同步会话) ##################
+# Redis数据库索引(默认为0)
+spring.redis.database=1
+# Redis服务器地址
+spring.redis.host=127.0.0.1
+# Redis服务器连接端口
+spring.redis.port=6379
+# Redis服务器连接密码(默认为空)
+spring.redis.password=
+```
+
+
+
+注意点:`sa-token.sso.allow-url`为了方便测试配置为`*`,线上生产环境一定要配置为详细URL地址 (之后的章节我们会详细阐述此配置项)
### 4、创建启动类
diff --git a/sa-token-doc/sso/sso-type1.md b/sa-token-doc/sso/sso-type1.md
index da45b819..87520f57 100644
--- a/sa-token-doc/sso/sso-type1.md
+++ b/sa-token-doc/sso/sso-type1.md
@@ -41,12 +41,20 @@ OK,所有理论就绪,下面开始实战:
### 3、指定Cookie的作用域
在`sso.stp.com`访问服务器,其Cookie也只能写入到`sso.stp.com`下,为了将Cookie写入到其父级域名`stp.com`下,我们需要更改 SSO-Server 端的 yml 配置:
-``` yml
-sa-token:
- cookie:
- # 配置Cookie作用域
- domain: stp.com
+
+
+``` yaml
+sa-token:
+ cookie:
+ # 配置 Cookie 作用域
+ domain: stp.com
```
+
+``` properties
+# 配置 Cookie 作用域
+sa-token.cookie.domain=stp.com
+```
+
这个配置原本是被注释掉的,现在将其打开。另外我们格外需要注意:
在SSO模式一测试完毕之后,一定要将这个配置再次注释掉,因为模式一与模式二三使用不同的授权流程,这行配置会影响到我们模式二和模式三的正常运行。
@@ -62,12 +70,14 @@ sa-token:
#### 4.1、引入依赖
新建项目 sa-token-demo-sso1-client,并添加以下依赖:
-``` xml
-
+
+
+``` xml
+
cn.dev33
sa-token-spring-boot-starter
- ${sa-token-version}
+ ${sa.top.version}
@@ -80,7 +90,7 @@ sa-token:
cn.dev33
sa-token-dao-redis-jackson
- ${sa-token-version}
+ ${sa.top.version}
org.apache.commons
@@ -91,9 +101,25 @@ sa-token:
cn.dev33
sa-token-alone-redis
- ${sa-token-version}
+ ${sa.top.version}
```
+
+``` gradle
+// Sa-Token 权限认证,在线文档:https://sa-token.cc
+implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
+
+// Sa-Token 插件:整合SSO
+implementation 'cn.dev33:sa-token-sso:${sa.top.version}'
+
+// Sa-Token 整合 Redis (使用 jackson 序列化方式)
+implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}'
+implementation 'org.apache.commons:commons-pool2'
+
+// Sa-Token插件:权限缓存与业务缓存分离
+implementation 'cn.dev33:sa-token-alone-redis:${sa.top.version}'
+```
+
#### 4.2、新建 Controller 控制器
@@ -130,12 +156,14 @@ public class SsoClientController {
#### 4.3、application.yml 配置
-``` yml
+
+
+``` yaml
# 端口
server:
port: 9001
-# sa-token配置
+# Sa-Token 配置
sa-token:
# SSO-相关配置
sso:
@@ -144,7 +172,7 @@ sa-token:
# SSO-Server端-单点注销地址
slo-url: http://sso.stp.com:9000/sso/logout
- # 配置Sa-Token单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis)
+ # 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis)
alone-redis:
# Redis数据库索引
database: 1
@@ -157,6 +185,32 @@ sa-token:
# 连接超时时间
timeout: 10s
```
+
+``` properties
+# 端口
+server.port=9001
+
+######### Sa-Token 配置 #########
+
+# SSO-Server端-单点登录授权地址
+sa-token.sso.auth-url=http://sso.stp.com:9000/sso/auth
+# SSO-Server端-单点注销地址
+sa-token.sso.slo-url=http://sso.stp.com:9000/sso/logout
+
+# 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis)
+# Redis数据库索引
+sa-token.alone-redis.database=1
+# Redis服务器地址
+sa-token.alone-redis.host=127.0.0.1
+# Redis服务器连接端口
+sa-token.alone-redis.port=6379
+# Redis服务器连接密码(默认为空)
+sa-token.alone-redis.password=
+# 连接超时时间
+sa-token.alone-redis.timeout=10s
+```
+
+
#### 4.4、启动类
diff --git a/sa-token-doc/sso/sso-type2.md b/sa-token-doc/sso/sso-type2.md
index 32365880..9cbfe3be 100644
--- a/sa-token-doc/sso/sso-type2.md
+++ b/sa-token-doc/sso/sso-type2.md
@@ -49,21 +49,30 @@
#### 3.1、去除 SSO-Server 的 Cookie 作用域配置
在SSO模式一章节中我们打开了配置:
-
-``` yml
+
+
+``` yaml
sa-token:
- cookie:
- # 配置Cookie作用域
- domain: stp.com
+ cookie:
+ # 配置 Cookie 作用域
+ domain: stp.com
```
+
+``` properties
+# 配置 Cookie 作用域
+sa-token.cookie.domain=stp.com
+```
+
-此为模式一专属配置,现在我们将其注释掉,并按照注释提示打开其他相应的注释
+此为模式一专属配置,现在我们将其注释掉
#### 3.2、创建 SSO-Client 端项目
-创建一个 SpringBoot 项目 `sa-token-demo-sso-client`,引入依赖:
-``` xml
-
+创建一个 SpringBoot 项目 `sa-token-demo-sso2-client`,引入依赖:
+
+
+``` xml
+
cn.dev33
sa-token-spring-boot-starter
@@ -94,6 +103,22 @@ sa-token:
${sa.top.version}
```
+
+``` gradle
+// Sa-Token 权限认证,在线文档:https://sa-token.cc
+implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
+
+// Sa-Token 插件:整合SSO
+implementation 'cn.dev33:sa-token-sso:${sa.top.version}'
+
+// Sa-Token 整合 Redis (使用 jackson 序列化方式)
+implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}'
+implementation 'org.apache.commons:commons-pool2'
+
+// Sa-Token插件:权限缓存与业务缓存分离
+implementation 'cn.dev33:sa-token-alone-redis:${sa.top.version}'
+```
+
#### 3.3、创建 SSO-Client 端认证接口
@@ -134,31 +159,62 @@ public class SsoClientController {
##### 3.4、配置SSO认证中心地址
你需要在 `application.yml` 配置如下信息:
-``` yml
+
+
+
+``` yaml
# 端口
server:
port: 9001
-
+
# sa-token配置
sa-token:
- # SSO-相关配置
- sso:
- # SSO-Server端 统一认证地址
- auth-url: http://sa-sso-server.com:9000/sso/auth
+ # SSO-相关配置
+ sso:
+ # SSO-Server端 统一认证地址
+ auth-url: http://sa-sso-server.com:9000/sso/auth
# 是否打开单点注销接口
is-slo: true
-
- # 配置Sa-Token单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis)
- alone-redis:
- # Redis数据库索引 (默认为0)
- database: 1
- # Redis服务器地址
- host: 127.0.0.1
- # Redis服务器连接端口
- port: 6379
- # Redis服务器连接密码(默认为空)
- password:
+
+ # 配置Sa-Token单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis)
+ alone-redis:
+ # Redis数据库索引 (默认为0)
+ database: 1
+ # Redis服务器地址
+ host: 127.0.0.1
+ # Redis服务器连接端口
+ port: 6379
+ # Redis服务器连接密码(默认为空)
+ password:
+ # 连接超时时间
+ timeout: 10s
```
+
+``` properties
+# 端口
+server.port=9001
+
+######### Sa-Token 配置 #########
+# SSO-Server端 统一认证地址
+sa-token.sso.auth-url=http://sa-sso-server.com:9000/sso/auth
+# 是否打开单点注销接口
+sa-token.sso.is-slo=true
+
+# 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis)
+# Redis数据库索引
+sa-token.alone-redis.database=1
+# Redis服务器地址
+sa-token.alone-redis.host=127.0.0.1
+# Redis服务器连接端口
+sa-token.alone-redis.port=6379
+# Redis服务器连接密码(默认为空)
+sa-token.alone-redis.password=
+# 连接超时时间
+sa-token.alone-redis.timeout=10s
+```
+
+
+
注意点:`sa-token.alone-redis` 的配置需要和SSO-Server端连接同一个Redis(database也要一样)
#### 3.5、写启动类
diff --git a/sa-token-doc/sso/sso-type3.md b/sa-token-doc/sso/sso-type3.md
index 4ebf827b..cb427b65 100644
--- a/sa-token-doc/sso/sso-type3.md
+++ b/sa-token-doc/sso/sso-type3.md
@@ -21,6 +21,9 @@
### 2、在Client 端更改 Ticket 校验方式
#### 2.1、增加 pom.xml 配置
+
+
+
``` xml
@@ -29,6 +32,14 @@
3.1.1
```
+
+``` gradle
+// Http请求工具
+implementation 'com.ejlchina:okhttps:3.1.1'
+```
+
+
+
> OkHttps是一个轻量级http请求工具,详情参考:[OkHttps](https://gitee.com/ejlchina-zhxu/okhttps)
#### 2.2、配置 http 请求处理器
@@ -48,14 +59,25 @@ private void configSso(SaSsoConfig sso) {
```
#### 2.3、application.yml 新增配置
-``` yml
+
+
+
+``` yaml
sa-token:
- sso:
+ sso:
# 打开模式三(使用Http请求校验ticket)
is-http: true
- # SSO-Server端 ticket校验地址
- check-ticket-url: http://sa-sso-server.com:9000/sso/checkTicket
+ # SSO-Server端 ticket校验地址
+ check-ticket-url: http://sa-sso-server.com:9000/sso/checkTicket
```
+
+``` properties
+# 打开模式三(使用Http请求校验ticket)
+sa-token.sso.is-http=true
+# SSO-Server端 ticket校验地址
+sa-token.sso.check-ticket-url=http://sa-sso-server.com:9000/sso/checkTicket
+```
+
#### 2.4、启动项目测试
重启项目,访问测试:[http://sa-sso-client1.com:9001/](http://sa-sso-client1.com:9001/)
@@ -87,13 +109,23 @@ public Object userinfo(String loginId) {
```
#### 3.2、在 Client 端调用此接口查询 userinfo
-首先在yml中配置接口地址
-``` yml
+首先在 application.yml 中配置接口地址:
+
+
+``` yaml
sa-token:
sso:
# SSO-Server端 查询userinfo地址
userinfo-url: http://sa-sso-server.com:9000/sso/userinfo
```
+
+``` properties
+# SSO-Server端 查询userinfo地址
+sa-token.sso.userinfo-url=http://sa-sso-server.com:9000/sso/userinfo
+```
+
+
+
然后在`SsoClientController`中新增接口
``` java
@@ -181,7 +213,10 @@ public Object myFollowList() {
#### 5.1、SSO-Client 端新增配置
在 `application.yml` 增加配置:`API调用秘钥` 和 `单点注销接口URL`。
-``` yml
+
+
+
+``` yaml
sa-token:
sso:
# 打开单点注销功能
@@ -191,6 +226,18 @@ sa-token:
# 接口调用秘钥
secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor
```
+
+``` properties
+# 打开单点注销功能
+sa-token.sso.is-slo=true
+# 单点注销地址
+sa-token.sso.slo-url=http://sa-sso-server.com:9000/sso/logout
+# 接口调用秘钥
+sa-token.sso.secretkey=kQwIOrYvnXmSDkwEiFngrKidMcdrgKor
+```
+
+
+
注意 secretkey 秘钥需要与SSO认证中心的一致
diff --git a/sa-token-doc/start/download.md b/sa-token-doc/start/download.md
index f885be05..54b5e19d 100644
--- a/sa-token-doc/start/download.md
+++ b/sa-token-doc/start/download.md
@@ -12,7 +12,7 @@
如果你使用的框架基于 ServletAPI 构建( SpringMVC、SpringBoot等 ),请引入此包
``` xml
-
+
cn.dev33
sa-token-spring-boot-starter
@@ -23,7 +23,7 @@
注:如果你使用的框架基于 Reactor 模型构建(Netty、WebFlux、ShenYu、SC Gateway等),请引入此包
``` xml
-
+
cn.dev33
sa-token-reactor-spring-boot-starter
@@ -34,7 +34,7 @@
参考:[Solon官网](https://solon.noear.org/)
``` xml
-
+
cn.dev33
sa-token-solon-plugin
@@ -45,7 +45,7 @@
参考:[JFinal官网](https://jfinal.com/)
``` xml
-
+
cn.dev33
sa-token-jfinal-plugin
@@ -56,7 +56,7 @@
参考:[Jboot官网](http://www.jboot.com.cn/)
``` xml
-
+
cn.dev33
sa-token-jboot-plugin
@@ -67,7 +67,7 @@
参考:[quarkus-sa-token](https://github.com/quarkiverse/quarkus-sa-token)
``` xml
-
+
io.quarkiverse.satoken
quarkus-satoken-resteasy
@@ -78,7 +78,7 @@
注:如果你的项目没有使用Spring,但是Web框架是基于 ServletAPI 规范的,可以引入此包
``` xml
-
+
cn.dev33
sa-token-servlet
@@ -90,7 +90,7 @@
注:如果你的项目既没有使用 SpringMVC、WebFlux,也不是基于 ServletAPI 规范,那么可以引入core核心包
``` xml
-
+
cn.dev33
sa-token-core
@@ -105,42 +105,42 @@
## Gradle依赖
-``` xml
+``` gradle
implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
```
-``` xml
+``` gradle
implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}'
```
-``` xml
+``` gradle
implementation 'cn.dev33:sa-token-solon-plugin:${sa.top.version}'
```
-``` xml
+``` gradle
implementation 'cn.dev33:sa-token-jfinal-plugin:${sa.top.version}'
```
-``` xml
+``` gradle
implementation 'cn.dev33:sa-token-jboot-plugin:${sa.top.version}'
```
-``` xml
+``` gradle
implementation 'io.quarkiverse.satoken:quarkus-satoken-resteasy:1.30.0'
```
-``` xml
+``` gradle
implementation 'cn.dev33:sa-token-servlet:${sa.top.version}'
```
-``` xml
+``` gradle
implementation 'cn.dev33:sa-token-core:${sa.top.version}'
```
@@ -152,7 +152,7 @@ implementation 'cn.dev33:sa-token-core:${sa.top.version}'
## 测试版
更多内测版本了解:[Sa-Token 最新版本](https://gitee.com/dromara/sa-token/blob/dev/sa-token-doc/start/new-version.md)
-Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.dev33.cn/doc.html#/start/maven-pull)
+Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.cc/doc.html#/start/maven-pull)
## jar包下载
[点击下载:sa-token-1.6.0.jar](https://oss.dev33.cn/sa-token/sa-token-1.6.0.jar)
diff --git a/sa-token-doc/start/example.md b/sa-token-doc/start/example.md
index d2f9830f..ebafc551 100644
--- a/sa-token-doc/start/example.md
+++ b/sa-token-doc/start/example.md
@@ -11,32 +11,41 @@
### 2、添加依赖
-在 `pom.xml` 中添加依赖:
+在项目中添加依赖:
+
+
``` xml
-
+
cn.dev33
sa-token-spring-boot-starter
${sa.top.version}
```
-更多内测版本了解:[Sa-Token最新版本](https://gitee.com/dromara/sa-token/blob/dev/sa-token-doc/start/new-version.md)
+
+``` gradle
+// Sa-Token 权限认证,在线文档:https://sa-token.cc
+implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}'
+```
+
-Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.dev33.cn/doc.html#/start/maven-pull)
+Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.cc/doc.html#/start/maven-pull)
+
+更多内测版本了解:[Sa-Token最新版本](https://gitee.com/dromara/sa-token/blob/dev/sa-token-doc/start/new-version.md)
### 3、设置配置文件
你可以**零配置启动项目** ,但同时你也可以在 `application.yml` 中增加如下配置,定制性使用框架:
-
+
-``` java
+``` yaml
server:
# 端口
port: 8081
-############## Sa-Token 配置 ##############
+############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
sa-token:
# token名称 (同时也是cookie名称)
token-name: satoken
@@ -55,12 +64,11 @@ sa-token:
```
-``` java
-server:
- # 端口
- port: 8081
+``` properties
+# 端口
+server.port=8081
-############## Sa-Token 配置 ##############
+############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
# token名称 (同时也是cookie名称)
sa-token.token-name=satoken
@@ -78,7 +86,7 @@ sa-token.token-style=uuid
sa-token.is-log=false
```
-
+
### 4、创建启动类
diff --git a/sa-token-doc/start/new-version.md b/sa-token-doc/start/new-version.md
index 1c4fc906..477e5649 100644
--- a/sa-token-doc/start/new-version.md
+++ b/sa-token-doc/start/new-version.md
@@ -1,6 +1,6 @@
# Sa-Token 最新版本
-在线文档:[https://sa-token.dev33.cn/](https://sa-token.dev33.cn/)
+在线文档:[https://sa-token.cc/](https://sa-token.cc/)
---
@@ -16,7 +16,7 @@ v1.31.0 正式版,可上生产:
```
-Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.dev33.cn/doc.html#/start/maven-pull)
+Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.cc/doc.html#/start/maven-pull)
---
diff --git a/sa-token-doc/start/webflux-example.md b/sa-token-doc/start/webflux-example.md
index 7ac19e56..435c4ec6 100644
--- a/sa-token-doc/start/webflux-example.md
+++ b/sa-token-doc/start/webflux-example.md
@@ -14,16 +14,26 @@
### 2、添加依赖
-在 `pom.xml` 中添加依赖:
+在项目中添加依赖:
+
+
``` xml
-
+
cn.dev33
sa-token-reactor-spring-boot-starter
${sa.top.version}
```
+
+``` gradle
+// Sa-Token 权限认证(Reactor响应式集成),在线文档:https://sa-token.cc
+implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}'
+```
+
+
+
### 3、创建启动类
@@ -54,7 +64,7 @@ public class SaTokenConfigure {
public SaReactorFilter getSaReactorFilter() {
return new SaReactorFilter()
// 指定 [拦截路由]
- .addInclude("/**")
+ .addInclude("/**") /* 拦截所有path */
// 指定 [放行路由]
.addExclude("/favicon.ico")
// 指定[认证函数]: 每次请求执行
diff --git a/sa-token-doc/static/doc.css b/sa-token-doc/static/doc.css
index 4da3b9d1..dca40bfb 100644
--- a/sa-token-doc/static/doc.css
+++ b/sa-token-doc/static/doc.css
@@ -106,7 +106,7 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu
.code-line-box {line-height: inherit !important; background-color: #191919; color: #aaa;font-weight: 400;font-size: 0.85em;text-align: center;}
/* xml语言样式优化 */
-.lang-xml .token.comment{color: #CDAB53;}
+/* .lang-xml .token.comment{color: #CDAB53;} */
.lang-xml .token.tag *{color: #db2d20;}
.lang-xml .token.attr-value{color: #A6E22E;}
@@ -123,24 +123,26 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu
.lang-java .token.keyword{color: #db2d20;}
.lang-java .token.namespace,.lang-java .token.namespace *{color: #01A252; opacity: 1;}
.lang-java .token.class-name,.lang-java .cm-variable{color: #55b5db; opacity: 1;}
-.lang-java .token.comment{color: #CDAB53;}
+/* .lang-java .token.comment{color: #CDAB53;} */
.lang-java .token.annotation.punctuation{color: #ddd;}
.lang-java .token.punctuation{color: #ddd;}
-/* yml语言样式优化 */
-.main-box .lang-yml{color: #01A252 !important; opacity: 1;}
+/* cmd语言样式优化 */
+.main-box .lang-cmd{color: #01A252 !important; opacity: 1;}
-/* yml语言样式优化 */
+/* url语言样式优化 */
.main-box .lang-url{color: #E96917 !important; opacity: 1;}
/* js语言样式优化 */
.main-box .lang-js{color: #01a252 !important;}
-.lang-js .token.comment{color: #CDAB53;}
+/* .lang-js .token.comment{color: #CDAB53;} */
/* .lang-js .token.string{color: #fded02;} */
.lang-js .token.string{color: #ddd;}
.lang-js .token.punctuation{color: #ddd;}
-/* .gt-container{padding: 1.5em; padding-bottom: 100px;} */
+/* yaml 和 properties 语言优化 */
+.lang-yaml .token.punctuation{color: #eee;}
+.lang-properties .token.attr-name{color: #22a2c9;}
/* ------- markdown 内容样式优化 ------- */
@@ -162,8 +164,14 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu
.gzh-table td b{display: block; margin-bottom: 10px; }
/* tab选项卡优化 */
+/* .docsify-tabs--classic{background-color: rgba(255, 255, 255, 0.2);} */
.docsify-tabs__tab{outline: 0; cursor: pointer;}
.docsify-tabs--classic .docsify-tabs__tab--active{box-shadow: 0 0 0;}
+/* tab卡片插件样式优化 */
+.main-box{
+ --docsifytabs-border-color: #ddd;
+ --docsifytabs-tab-color: #777;
+}
/* 调整表格的响应式 */
@@ -209,6 +217,7 @@ body {
#main .toc-box a{border-color: rgba(0,0,0,0); transition: 0s;}
#main .toc-box a span{color: inherit;}
+
/* 加载图片的按钮 */
.show-img{
background-color: #FFF;
diff --git a/sa-token-doc/static/prism/prism-gradle.min.js b/sa-token-doc/static/prism/prism-gradle.min.js
new file mode 100644
index 00000000..96aae9aa
--- /dev/null
+++ b/sa-token-doc/static/prism/prism-gradle.min.js
@@ -0,0 +1 @@
+!function(e){var n={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.gradle=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:apply|def|dependencies|else|if|implementation|import|plugin|plugins|project|repositories|repository|sourceSets|tasks|val)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("gradle","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}}}),e.languages.insertBefore("gradle","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("gradle","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),n.inside.expression.inside=e.languages.gradle}(Prism);
\ No newline at end of file
diff --git a/sa-token-doc/static/prism/prism-java.min.js b/sa-token-doc/static/prism/prism-java.min.js
new file mode 100644
index 00000000..9b90cf3c
--- /dev/null
+++ b/sa-token-doc/static/prism/prism-java.min.js
@@ -0,0 +1 @@
+!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism);
\ No newline at end of file
diff --git a/sa-token-doc/static/prism/prism-properties.min.js b/sa-token-doc/static/prism/prism-properties.min.js
new file mode 100644
index 00000000..5976d476
--- /dev/null
+++ b/sa-token-doc/static/prism/prism-properties.min.js
@@ -0,0 +1 @@
+Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,value:{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0,alias:"attr-value"},key:{pattern:/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,alias:"attr-name"},punctuation:/[=:]/};
\ No newline at end of file
diff --git a/sa-token-doc/static/prism/prism-yaml.min.js b/sa-token-doc/static/prism/prism-yaml.min.js
new file mode 100644
index 00000000..5cd16d3d
--- /dev/null
+++ b/sa-token-doc/static/prism/prism-yaml.min.js
@@ -0,0 +1 @@
+!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism);
\ No newline at end of file
diff --git a/sa-token-doc/up/global-filter.md b/sa-token-doc/up/global-filter.md
index 816892f4..d305f2bf 100644
--- a/sa-token-doc/up/global-filter.md
+++ b/sa-token-doc/up/global-filter.md
@@ -23,7 +23,6 @@ Sa-Token同时提供过滤器和拦截器机制,不是为了让谁替代谁,
``` java
/**
* [Sa-Token 权限认证] 配置类
- * @author kong
*/
@Configuration
public class SaTokenConfigure {
@@ -36,7 +35,7 @@ public class SaTokenConfigure {
return new SaServletFilter()
// 指定 拦截路由 与 放行路由
- .addInclude("/**").addExclude("/favicon.ico")
+ .addInclude("/**").addExclude("/favicon.ico") /* 排除掉 /favicon.ico */
// 认证函数: 每次请求执行
.setAuth(obj -> {
@@ -45,7 +44,7 @@ public class SaTokenConfigure {
// 登录认证 -- 拦截所有路由,并排除/user/doLogin 用于开放登录
SaRouter.match("/**", "/user/doLogin", () -> StpUtil.checkLogin());
- // 更多拦截处理方式,请参考“路由拦截式鉴权”章节
+ // 更多拦截处理方式,请参考“路由拦截式鉴权”章节 */
})
// 异常处理函数:每次认证函数发生异常时执行此函数
@@ -97,7 +96,6 @@ JSON 工具类可参考:[Hutool-Json](https://hutool.cn/docs/#/json/JSONUtil)
``` java
/**
* [Sa-Token 权限认证] 配置类
- * @author kong
*/
@Configuration
public class SaTokenConfigure {
diff --git a/sa-token-doc/up/integ-redis.md b/sa-token-doc/up/integ-redis.md
index ae942232..43d66bb8 100644
--- a/sa-token-doc/up/integ-redis.md
+++ b/sa-token-doc/up/integ-redis.md
@@ -14,6 +14,9 @@ Sa-Token 默认将数据保存在内存中,此模式读写速度最快,且
---
### 方式1、Sa-Token 整合 Redis (使用 jdk 默认序列化方式)
+
+
+
``` xml
@@ -22,10 +25,20 @@ Sa-Token 默认将数据保存在内存中,此模式读写速度最快,且
${sa.top.version}
```
+
+``` gradle
+// Sa-Token 整合 Redis (使用 jdk 默认序列化方式)
+implementation 'cn.dev33:sa-token-dao-redis:${sa.top.version}'
+```
+
+
优点:兼容性好,缺点:Session 序列化后基本不可读,对开发者来讲等同于乱码。
### 方式2、Sa-Token 整合 Redis(使用 jackson 序列化方式)
+
+
+
``` xml
@@ -34,6 +47,13 @@ Sa-Token 默认将数据保存在内存中,此模式读写速度最快,且
${sa.top.version}
```
+
+``` gradle
+// Sa-Token 整合 Redis (使用 jackson 序列化方式)
+implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}'
+```
+
+
优点:Session 序列化后可读性强,可灵活手动修改,缺点:兼容性稍差。
@@ -41,18 +61,30 @@ Sa-Token 默认将数据保存在内存中,此模式读写速度最快,且
**1. 无论使用哪种序列化方式,你都必须为项目提供一个 Redis 实例化方案,例如:**
-``` xml
+
+
+
+``` xml
org.apache.commons
commons-pool2
```
+
+``` gradle
+// Sa-Token 整合 Redis (使用 jackson 序列化方式)
+implementation 'org.apache.commons:commons-pool2'
+```
+
+
**2. 引入了依赖,我还需要为 Redis 配置连接信息吗?**
需要!只有项目初始化了正确的 Redis 实例,`Sa-Token`才可以使用 Redis 进行数据持久化,参考以下`yml配置`:
-``` java
-# 端口
+
+
+
+``` yaml
spring:
# redis配置
redis:
@@ -77,6 +109,30 @@ spring:
# 连接池中的最小空闲连接
min-idle: 0
```
+
+``` properties
+# Redis数据库索引(默认为0)
+spring.redis.database=1
+# Redis服务器地址
+spring.redis.host=127.0.0.1
+# Redis服务器连接端口
+spring.redis.port=6379
+# Redis服务器连接密码(默认为空)
+# spring.redis.password=
+# 连接超时时间
+spring.redis.timeout=10s
+# 连接池最大连接数
+spring.redis.lettuce.pool.max-active=200
+# 连接池最大阻塞等待时间(使用负值表示没有限制)
+spring.redis.lettuce.pool.max-wait=-1ms
+# 连接池中的最大空闲连接
+spring.redis.lettuce.pool.max-idle=10
+# 连接池中的最小空闲连接
+spring.redis.lettuce.pool.min-idle=0
+```
+
+
+
**3. 集成 Redis 后,是我额外手动保存数据,还是框架自动保存?**
diff --git a/sa-token-doc/up/many-account.md b/sa-token-doc/up/many-account.md
index e69c2b5b..12cb3022 100644
--- a/sa-token-doc/up/many-account.md
+++ b/sa-token-doc/up/many-account.md
@@ -188,6 +188,44 @@ public class StpUserUtil {
}
```
+### 9、多账号体系混合鉴权
+QQ群中经常有小伙伴提问:在多账号体系下,怎么在 SaInterceptor 拦截器中给一个接口登录鉴权?
+
+其实这个问题,主要是靠你的业务需求来决定,以后台 Admin 账号和前台 User 账号为例:
+
+``` java
+// 注册 Sa-Token 拦截器
+@Override
+public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(new SaInterceptor(handle -> {
+
+ // 如果这个接口,要求客户端登录了后台 Admin 账号才能访问:
+ SaRouter.match("/art/getInfo").check(r -> StpUtil.checkLogin());
+
+ // 如果这个接口,要求客户端登录了前台 User 账号才能访问:
+ SaRouter.match("/art/getInfo").check(r -> StpUserUtil.checkLogin());
+
+ // 如果这个接口,要求客户端同时登录 Admin 和 User 账号,才能访问:
+ SaRouter.match("/art/getInfo").check(r -> {
+ StpUtil.checkLogin();
+ StpUserUtil.checkLogin();
+ });
+
+ // 如果这个接口,要求客户端登录 Admin 和 User 账号任意一个,就能访问:
+ SaRouter.match("/art/getInfo").check(r -> {
+ if(StpUtil.isLogin() == false && StpUserUtil.isLogin() == false) {
+ throw new SaTokenException("请登录后再访问接口");
+ }
+ });
+
+ })).addPathPatterns("/**");
+}
+```
+
+
+
+
+
---
+
+``` yaml
sa-token:
# token前缀
token-prefix: Bearer
```
+
+``` properties
+# token前缀
+sa-token.token-prefix: Bearer
+```
+
+
此时 Sa-Token 便可在读取 Token 时裁剪掉 `Bearer`,成功获取`xxxx-xxxx-xxxx-xxxx`。
diff --git a/sa-token-doc/up/token-style.md b/sa-token-doc/up/token-style.md
index 8cbc31da..78f9620a 100644
--- a/sa-token-doc/up/token-style.md
+++ b/sa-token-doc/up/token-style.md
@@ -59,7 +59,7 @@ public class SaTokenConfigure {
```
2、再次调用 `StpUtil.login(10001)`方法进行登录,观察其生成的token样式:
-``` html
+``` java
gfuPSwZsnUhwgz08GTCH4wOgasWtc3odP4HLwXJ7NDGOximTvT4OlW19zeLH
```
diff --git a/sa-token-doc/use/config.md b/sa-token-doc/use/config.md
index d5455054..baf3d37f 100644
--- a/sa-token-doc/use/config.md
+++ b/sa-token-doc/use/config.md
@@ -6,12 +6,11 @@
### 方式1、在 application.yml 配置
-
+
-
-``` java
-############## Sa-Token 配置 ##############
-############## 在线参考:https://sa-token.dev33.cn/doc.html#/use/config ##############
+
+``` yaml
+############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
sa-token:
# token名称 (同时也是cookie名称)
token-name: satoken
@@ -29,10 +28,9 @@ sa-token:
is-log: false
```
-
-``` java
-############## Sa-Token 配置 ##############
-############## 在线参考:https://sa-token.dev33.cn/doc.html#/use/config ##############
+
+``` properties
+############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
# token名称 (同时也是cookie名称)
sa-token.token-name=satoken
@@ -50,7 +48,7 @@ sa-token.token-style=uuid
sa-token.is-log=false
```
-
+
@@ -60,11 +58,12 @@ sa-token.is-log=false
``` java
/**
- * Sa-Token代码方式进行配置
+ * Sa-Token 配置类
*/
@Configuration
public class SaTokenConfigure {
- // 获取配置Bean (以代码的方式配置Sa-Token, 此配置会覆盖 application.yml 中的配置)
+ // Sa-Token 参数配置,参考文档:https://sa-token.cc
+ // 此配置会覆盖 application.yml 中的配置
@Bean
@Primary
public SaTokenConfig getSaTokenConfigPrimary() {
@@ -83,11 +82,11 @@ public class SaTokenConfigure {
``` java
/**
- * Sa-Token代码方式进行配置
+ * Sa-Token 配置类
*/
@Configuration
public class SaTokenConfigure {
- // 以代码的方式配置 SaTokenConfig
+ // Sa-Token 参数配置,参考文档:https://sa-token.cc
// 此配置会与 application.yml 中的配置合并 (代码配置优先)
@Autowired
public void configSaToken(SaTokenConfig config) {
@@ -126,6 +125,7 @@ public class SaTokenConfigure {
| isReadBody | Boolean | true | 是否尝试从 请求体 里读取 Token |
| isReadHeader | Boolean | true | 是否尝试从 header 里读取 Token |
| isReadCookie | Boolean | true | 是否尝试从 cookie 里读取 Token,此值为 false 后,`StpUtil.login(id)` 登录时也不会再往前端注入Cookie |
+| isWriteHeader | Boolean | false | 是否在登录后将 Token 写入到响应头 |
| 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) |
@@ -181,7 +181,10 @@ Client 端:
配置示例:
-``` yml
+
+
+
+``` yaml
# Sa-Token 配置
sa-token:
# SSO-相关配置
@@ -189,6 +192,13 @@ sa-token:
# SSO-Server端 单点登录授权地址
auth-url: http://sa-sso-server.com:9000/sso/auth
```
+
+``` properties
+# SSO-Server端 单点登录授权地址
+sa-token.sso.auth-url=http://sa-sso-server.com:9000/sso/auth
+```
+
+
@@ -207,7 +217,9 @@ sa-token:
| pastClientTokenTimeout | long | 7200 | `Past-Client-Token` 保存的时间(单位:秒) ,默认为-1,代表延续 `Client-Token` 的有效时间 |
配置示例:
-``` yml
+
+
+``` yaml
# Sa-Token 配置
sa-token:
token-name: satoken-server
@@ -218,6 +230,18 @@ sa-token:
is-password: true
is-client: true
```
+
+``` properties
+# Sa-Token 配置
+sa-token.token-name=satoken-server
+# OAuth2.0 配置
+sa-token.oauth2.is-code=true
+sa-token.oauth2.is-implicit=true
+sa-token.oauth2.is-password=true
+sa-token.oauth2.is-client=true
+```
+
+
##### SaClientModel属性定义
| 参数名称 | 类型 | 默认值 | 说明 |
@@ -300,30 +324,24 @@ sa-token:
在开发 SSO 模块时,我们需要在 sso-client 配置认证中心的各种地址,特别是在模式三下,一般代码会变成这样:
-``` java
+``` yaml
sa-token:
sso:
# SSO-Server端 统一认证地址
auth-url: http://sa-sso-server.com:9000/sso/auth
- # 使用Http请求校验ticket
- is-http: true
# SSO-Server端 ticket校验地址
check-ticket-url: http://sa-sso-server.com:9000/sso/checkTicket
# 单点注销地址
slo-url: http://sa-sso-server.com:9000/sso/logout
- # 接口调用秘钥
- secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor
# SSO-Server端 查询userinfo地址
userinfo-url: http://sa-sso-server.com:9000/sso/userinfo
```
一堆 xxx-url 配置比较繁琐,且含有大量重复字符,现在我们可以将其简化为:
-``` java
+``` yaml
sa-token:
sso:
server-url: http://sa-sso-server.com:9000
- is-http: true
- secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor
```
只要你配置了 `server-url` 地址,Sa-Token 就可以自动拼接出其它四个地址:
diff --git a/sa-token-doc/use/route-check.md b/sa-token-doc/use/route-check.md
index f515f7d6..2ce32104 100644
--- a/sa-token-doc/use/route-check.md
+++ b/sa-token-doc/use/route-check.md
@@ -44,7 +44,7 @@ public class SaTokenConfigure implements WebMvcConfigurer {
registry.addInterceptor(new SaInterceptor(handler -> {
// 指定一条 match 规则
SaRouter
- .match("/**") // 拦截的 path 列表,可以写多个
+ .match("/**") // 拦截的 path 列表,可以写多个 */
.notMatch("/user/doLogin") // 排除掉的 path 列表,可以写多个
.check(r -> StpUtil.checkLogin()); // 要执行的校验动作,可以写完整的 lambda 表达式
diff --git a/sa-token-plugin/sa-token-alone-redis/pom.xml b/sa-token-plugin/sa-token-alone-redis/pom.xml
index 09c3c65f..04458cf1 100644
--- a/sa-token-plugin/sa-token-alone-redis/pom.xml
+++ b/sa-token-plugin/sa-token-alone-redis/pom.xml
@@ -29,12 +29,24 @@
sa-token-dao-redis-jackson
${revision}
true
+
+
+ cn.dev33
+ sa-token-dao-redis-fastjson
+ ${revision}
+ true
+
+
+ cn.dev33
+ sa-token-dao-redis-fastjson2
+ ${revision}
+ true
org.apache.commons
commons-pool2
- 2.5.0
+ ${commons-pool2.version}
true
diff --git a/sa-token-plugin/sa-token-alone-redis/src/main/java/cn/dev33/satoken/dao/alone/SaAloneRedisInject.java b/sa-token-plugin/sa-token-alone-redis/src/main/java/cn/dev33/satoken/dao/alone/SaAloneRedisInject.java
index 69dc94c6..a5e2a2b8 100644
--- a/sa-token-plugin/sa-token-alone-redis/src/main/java/cn/dev33/satoken/dao/alone/SaAloneRedisInject.java
+++ b/sa-token-plugin/sa-token-alone-redis/src/main/java/cn/dev33/satoken/dao/alone/SaAloneRedisInject.java
@@ -18,6 +18,8 @@ import org.springframework.data.redis.connection.lettuce.LettucePoolingClientCon
import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.dao.SaTokenDaoDefaultImpl;
import cn.dev33.satoken.dao.SaTokenDaoRedis;
+import cn.dev33.satoken.dao.SaTokenDaoRedisFastjson;
+import cn.dev33.satoken.dao.SaTokenDaoRedisFastjson2;
import cn.dev33.satoken.dao.SaTokenDaoRedisJackson;
/**
@@ -95,7 +97,7 @@ public class SaAloneRedisInject implements EnvironmentAware{
factory.afterPropertiesSet();
// 3. 开始初始化 SaTokenDao
- // 如果是SaTokenDaoRedis
+ // 如果开发者引入的是:sa-token-dao-redis
try {
Class.forName("cn.dev33.satoken.dao.SaTokenDaoRedis");
SaTokenDaoRedis dao = (SaTokenDaoRedis)saTokenDao;
@@ -104,7 +106,7 @@ public class SaAloneRedisInject implements EnvironmentAware{
return;
} catch (ClassNotFoundException e) {
}
- // 如果是SaTokenDaoRedisJackson
+ // 如果开发者引入的是:sa-token-dao-redis-jackson
try {
Class.forName("cn.dev33.satoken.dao.SaTokenDaoRedisJackson");
SaTokenDaoRedisJackson dao = (SaTokenDaoRedisJackson)saTokenDao;
@@ -113,6 +115,24 @@ public class SaAloneRedisInject implements EnvironmentAware{
return;
} catch (ClassNotFoundException e) {
}
+ // 如果开发者引入的是:sa-token-dao-redis-fastjson
+ try {
+ Class.forName("cn.dev33.satoken.dao.SaTokenDaoRedisFastjson");
+ SaTokenDaoRedisFastjson dao = (SaTokenDaoRedisFastjson)saTokenDao;
+ dao.isInit = false;
+ dao.init(factory);
+ return;
+ } catch (ClassNotFoundException e) {
+ }
+ // 如果开发者引入的是:sa-token-dao-redis-fastjson2
+ try {
+ Class.forName("cn.dev33.satoken.dao.SaTokenDaoRedisFastjson2");
+ SaTokenDaoRedisFastjson2 dao = (SaTokenDaoRedisFastjson2)saTokenDao;
+ dao.isInit = false;
+ dao.init(factory);
+ return;
+ } catch (ClassNotFoundException e) {
+ }
} catch (Exception e) {
e.printStackTrace();
}
diff --git a/sa-token-plugin/sa-token-context-dubbo/pom.xml b/sa-token-plugin/sa-token-context-dubbo/pom.xml
index 158e75e2..4bfcb873 100644
--- a/sa-token-plugin/sa-token-context-dubbo/pom.xml
+++ b/sa-token-plugin/sa-token-context-dubbo/pom.xml
@@ -28,7 +28,7 @@
org.apache.dubbo
dubbo
- 2.7.15
+ ${dubbo.version}
org.springframework.boot
spring-boot-configuration-processor
- 2.5.12
+ ${springboot.version}
true
diff --git a/sa-token-plugin/sa-token-jwt/pom.xml b/sa-token-plugin/sa-token-jwt/pom.xml
index bdaf04ef..a43ed8f1 100644
--- a/sa-token-plugin/sa-token-jwt/pom.xml
+++ b/sa-token-plugin/sa-token-jwt/pom.xml
@@ -27,7 +27,7 @@
cn.hutool
hutool-jwt
- 5.8.5
+ ${hutool-jwt.version}
diff --git a/sa-token-plugin/sa-token-quick-login/pom.xml b/sa-token-plugin/sa-token-quick-login/pom.xml
index 121bd159..5bf1f1ad 100644
--- a/sa-token-plugin/sa-token-quick-login/pom.xml
+++ b/sa-token-plugin/sa-token-quick-login/pom.xml
@@ -27,7 +27,7 @@
org.springframework.boot
spring-boot-starter-thymeleaf
- 2.5.12
+ ${springboot.version}
diff --git a/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/SaQuickRegister.java b/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/SaQuickRegister.java
index 337e3ab3..83f92840 100644
--- a/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/SaQuickRegister.java
+++ b/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/SaQuickRegister.java
@@ -41,17 +41,22 @@ public class SaQuickRegister {
@Order(SaTokenConsts.ASSEMBLY_ORDER - 1)
public SaServletFilter getSaServletFilter() {
return new SaServletFilter()
- // 拦截路由 & 放行路由
- .addInclude(SaQuickManager.getConfig().getInclude().split(","))
- .addExclude(SaQuickManager.getConfig().getExclude().split(","))
+ // 拦截路由
+ .addInclude("/**")
+ // 排除掉登录相关接口,不需要鉴权的
.addExclude("/favicon.ico", "/saLogin", "/doLogin", "/sa-res/**").
// 认证函数: 每次请求执行
- setAuth(r -> {
- // 未登录时直接转发到login.html页面
- if (SaQuickManager.getConfig().getAuth() && StpUtil.isLogin() == false) {
- SaHolder.getRequest().forward("/saLogin");
- SaRouter.back();
- }
+ setAuth(obj -> {
+ SaRouter
+ .match(SaQuickManager.getConfig().getInclude().split(","))
+ .notMatch(SaQuickManager.getConfig().getExclude().split(","))
+ .check(r -> {
+ // 未登录时直接转发到login.html页面
+ if (SaQuickManager.getConfig().getAuth() && StpUtil.isLogin() == false) {
+ SaHolder.getRequest().forward("/saLogin");
+ SaRouter.back();
+ }
+ });
}).
// 异常处理函数:每次认证函数发生异常时执行此函数
diff --git a/sa-token-plugin/sa-token-quick-login/src/main/resources/static/sa-res/login.js b/sa-token-plugin/sa-token-quick-login/src/main/resources/static/sa-res/login.js
index 5e619d17..5d79d67a 100644
--- a/sa-token-plugin/sa-token-quick-login/src/main/resources/static/sa-res/login.js
+++ b/sa-token-plugin/sa-token-quick-login/src/main/resources/static/sa-res/login.js
@@ -61,5 +61,5 @@ $('[name=name],[name=pwd]').bind('keypress', function(event){
$("[name=name]").focus();
// 打印信息
-var str = "This page is provided by Sa-Token, Please refer to: " + "http://sa-token.dev33.cn/";
+var str = "This page is provided by Sa-Token, Please refer to: " + "https://sa-token.cc/";
console.log(str);
diff --git a/sa-token-plugin/sa-token-spring-aop/pom.xml b/sa-token-plugin/sa-token-spring-aop/pom.xml
index 3b08c64c..9475a39b 100644
--- a/sa-token-plugin/sa-token-spring-aop/pom.xml
+++ b/sa-token-plugin/sa-token-spring-aop/pom.xml
@@ -27,7 +27,7 @@
org.springframework.boot
spring-boot-starter-aop
- 2.5.12
+ ${springboot.version}
diff --git a/sa-token-plugin/sa-token-temp-jwt/pom.xml b/sa-token-plugin/sa-token-temp-jwt/pom.xml
index 7fe0a32f..3ac777a6 100644
--- a/sa-token-plugin/sa-token-temp-jwt/pom.xml
+++ b/sa-token-plugin/sa-token-temp-jwt/pom.xml
@@ -27,13 +27,13 @@
io.jsonwebtoken
jjwt
- 0.9.1
+ ${jjwt.version}
diff --git a/sa-token-starter/sa-token-jboot-plugin/pom.xml b/sa-token-starter/sa-token-jboot-plugin/pom.xml
index 685064ee..9a09461a 100644
--- a/sa-token-starter/sa-token-jboot-plugin/pom.xml
+++ b/sa-token-starter/sa-token-jboot-plugin/pom.xml
@@ -24,7 +24,7 @@
io.jboot
jboot
- 3.14.4
+ ${jboot.version}
provided
diff --git a/sa-token-starter/sa-token-jfinal-plugin/pom.xml b/sa-token-starter/sa-token-jfinal-plugin/pom.xml
index 8604009c..6ac0c80b 100644
--- a/sa-token-starter/sa-token-jfinal-plugin/pom.xml
+++ b/sa-token-starter/sa-token-jfinal-plugin/pom.xml
@@ -32,7 +32,7 @@
com.jfinal
jfinal
- 4.9.17
+ ${jfinal.version}
provided
diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/pom.xml b/sa-token-starter/sa-token-reactor-spring-boot-starter/pom.xml
index b8513d25..d353fa9f 100644
--- a/sa-token-starter/sa-token-reactor-spring-boot-starter/pom.xml
+++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/pom.xml
@@ -23,27 +23,47 @@
sa-token-core
${revision}
-
+
+
org.springframework.boot
spring-boot-starter
- 2.5.12
+ ${springboot.version}
true
-
+
+
org.springframework
spring-web
5.3.7
true
-
+
+
io.projectreactor
reactor-core
- 3.1.4.RELEASE
+ ${reactor-core.version}
true
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson-databind.version}
+ true
+
+
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ ${springboot.version}
+ true
+
+
cn.dev33
@@ -51,6 +71,7 @@
${revision}
true
+
cn.dev33
@@ -59,26 +80,10 @@
true
-
-
- com.fasterxml.jackson.core
- jackson-databind
- 2.12.6.1
- true
-
-
-
-
- org.springframework.boot
- spring-boot-configuration-processor
- 2.5.12
- true
-
-
diff --git a/sa-token-starter/sa-token-servlet/pom.xml b/sa-token-starter/sa-token-servlet/pom.xml
index 04f508b9..ed2f4aa7 100644
--- a/sa-token-starter/sa-token-servlet/pom.xml
+++ b/sa-token-starter/sa-token-servlet/pom.xml
@@ -23,11 +23,12 @@
sa-token-core
${revision}
-
+
+
javax.servlet
javax.servlet-api
- 3.1.0
+ ${servlet-api.version}
true
diff --git a/sa-token-starter/sa-token-solon-plugin/pom.xml b/sa-token-starter/sa-token-solon-plugin/pom.xml
index 1b1ac43f..ea599bd7 100644
--- a/sa-token-starter/sa-token-solon-plugin/pom.xml
+++ b/sa-token-starter/sa-token-solon-plugin/pom.xml
@@ -17,17 +17,17 @@
solon integrate sa-token
-
- org.noear
- solon
- 1.10.4
-
-
cn.dev33
sa-token-core
${revision}
+
+
+ org.noear
+ solon
+ ${solon.version}
+
\ No newline at end of file
diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java
index 26b91cac..7991d65b 100644
--- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java
+++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java
@@ -3,7 +3,6 @@ package cn.dev33.satoken.solon;
import org.noear.solon.Solon;
import org.noear.solon.core.AopContext;
import org.noear.solon.core.Plugin;
-import org.noear.solon.core.event.EventBus;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.annotation.SaCheckBasic;
@@ -34,6 +33,7 @@ import cn.dev33.satoken.temp.SaTempInterface;
* @author noear
* @since 1.4
*/
+@SuppressWarnings("deprecation")
public class XPluginImp implements Plugin {
@Override
diff --git a/sa-token-starter/sa-token-solon-plugin/src/test/java/demo/Config.java b/sa-token-starter/sa-token-solon-plugin/src/test/java/demo/Config.java
index 8bd221b1..0002d8f0 100644
--- a/sa-token-starter/sa-token-solon-plugin/src/test/java/demo/Config.java
+++ b/sa-token-starter/sa-token-solon-plugin/src/test/java/demo/Config.java
@@ -1,19 +1,21 @@
package demo;
-import cn.dev33.satoken.router.SaRouter;
-import cn.dev33.satoken.solon.integration.SaTokenPathFilter;
-import cn.dev33.satoken.stp.StpUtil;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.core.handle.Filter;
+import cn.dev33.satoken.router.SaRouter;
+import cn.dev33.satoken.solon.integration.SaTokenPathFilter;
+import cn.dev33.satoken.stp.StpUtil;
+
/**
* @author noear 2022/3/30 created
*/
+@SuppressWarnings("deprecation")
@Configuration
public class Config {
- @Bean
+ @Bean
public Filter saTokenFilter() {
return new SaTokenPathFilter()
// 指定 [拦截路由] 与 [放行路由]
diff --git a/sa-token-starter/sa-token-spring-boot-starter/pom.xml b/sa-token-starter/sa-token-spring-boot-starter/pom.xml
index 72746940..4d26ef46 100644
--- a/sa-token-starter/sa-token-spring-boot-starter/pom.xml
+++ b/sa-token-starter/sa-token-spring-boot-starter/pom.xml
@@ -17,16 +17,28 @@
springboot integrate sa-token
+
cn.dev33
sa-token-servlet
${revision}
+
+
org.springframework.boot
spring-boot-starter-web
- 2.5.12
+ ${springboot.version}
+
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ ${springboot.version}
+ true
+
+
cn.dev33
@@ -34,6 +46,7 @@
${revision}
true
+
cn.dev33
@@ -41,14 +54,6 @@
${revision}
true
-
-
-
- org.springframework.boot
- spring-boot-configuration-processor
- 2.5.12
- true
-
diff --git a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/context/model/SaCookieTest.java b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/context/model/SaCookieTest.java
index 8c223cab..207135f1 100644
--- a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/context/model/SaCookieTest.java
+++ b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/context/model/SaCookieTest.java
@@ -16,7 +16,7 @@ public class SaCookieTest {
@Test
public void test() {
SaCookie cookie = new SaCookie("satoken", "xxxx-xxxx-xxxx-xxxx")
- .setDomain("https://sa-token.dev33.cn/")
+ .setDomain("https://sa-token.cc/")
.setMaxAge(-1)
.setPath("/")
.setSameSite("Lax")
@@ -25,13 +25,13 @@ public class SaCookieTest {
Assertions.assertEquals(cookie.getName(), "satoken");
Assertions.assertEquals(cookie.getValue(), "xxxx-xxxx-xxxx-xxxx");
- Assertions.assertEquals(cookie.getDomain(), "https://sa-token.dev33.cn/");
+ Assertions.assertEquals(cookie.getDomain(), "https://sa-token.cc/");
Assertions.assertEquals(cookie.getMaxAge(), -1);
Assertions.assertEquals(cookie.getPath(), "/");
Assertions.assertEquals(cookie.getSameSite(), "Lax");
Assertions.assertEquals(cookie.getHttpOnly(), true);
Assertions.assertEquals(cookie.getSecure(), true);
- Assertions.assertEquals(cookie.toHeaderValue(), "satoken=xxxx-xxxx-xxxx-xxxx; Domain=https://sa-token.dev33.cn/; Path=/; Secure; HttpOnly; sameSite=Lax");
+ Assertions.assertEquals(cookie.toHeaderValue(), "satoken=xxxx-xxxx-xxxx-xxxx; Domain=https://sa-token.cc/; Path=/; Secure; HttpOnly; sameSite=Lax");
Assertions.assertNotNull(cookie.toString());
}
diff --git a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java
index f8e7baa6..ad9abb05 100644
--- a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java
+++ b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java
@@ -166,49 +166,49 @@ public class SaFoxUtilTest {
@Test
public void joinParam() {
// 参数为空时,返回原url
- Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", null), "https://sa-token.dev33.cn");
- Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", ""), "https://sa-token.dev33.cn");
+ Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", null), "https://sa-token.cc");
+ Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", ""), "https://sa-token.cc");
// url为空时,视为空字符串
Assertions.assertEquals(SaFoxUtil.joinParam(null, "id=1"), "?id=1");
Assertions.assertEquals(SaFoxUtil.joinParam("", "id=1"), "?id=1");
// 各种情况的测试
- Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", "id=1"), "https://sa-token.dev33.cn?id=1");
- Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?", "id=1"), "https://sa-token.dev33.cn?id=1");
- Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?name=zhang", "id=1"), "https://sa-token.dev33.cn?name=zhang&id=1");
- Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?name=zhang&", "id=1"), "https://sa-token.dev33.cn?name=zhang&id=1");
+ Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", "id=1"), "https://sa-token.cc?id=1");
+ Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?", "id=1"), "https://sa-token.cc?id=1");
+ Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?name=zhang", "id=1"), "https://sa-token.cc?name=zhang&id=1");
+ Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?name=zhang&", "id=1"), "https://sa-token.cc?name=zhang&id=1");
// 重载方法测试
- Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?name=zhang&", "id", 1), "https://sa-token.dev33.cn?name=zhang&id=1");
+ Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?name=zhang&", "id", 1), "https://sa-token.cc?name=zhang&id=1");
// url或key为null时,不拼接
Assertions.assertEquals(SaFoxUtil.joinParam(null, "id", 1), null);
- Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", null, 1), "https://sa-token.dev33.cn");
+ Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", null, 1), "https://sa-token.cc");
// value为null时,会拼接出一个null字符串
- Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", "id", null), "https://sa-token.dev33.cn?id=null");
+ Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", "id", null), "https://sa-token.cc?id=null");
}
@Test
public void joinSharpParam() {
// 参数为空时,返回原url
- Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", null), "https://sa-token.dev33.cn");
- Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", ""), "https://sa-token.dev33.cn");
+ Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", null), "https://sa-token.cc");
+ Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", ""), "https://sa-token.cc");
// url为空时,视为空字符串
Assertions.assertEquals(SaFoxUtil.joinSharpParam(null, "id=1"), "#id=1");
Assertions.assertEquals(SaFoxUtil.joinSharpParam("", "id=1"), "#id=1");
// 各种情况的测试
- Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", "id=1"), "https://sa-token.dev33.cn#id=1");
- Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#", "id=1"), "https://sa-token.dev33.cn#id=1");
- Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#name=zhang", "id=1"), "https://sa-token.dev33.cn#name=zhang&id=1");
- Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#name=zhang&", "id=1"), "https://sa-token.dev33.cn#name=zhang&id=1");
+ Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", "id=1"), "https://sa-token.cc#id=1");
+ Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#", "id=1"), "https://sa-token.cc#id=1");
+ Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#name=zhang", "id=1"), "https://sa-token.cc#name=zhang&id=1");
+ Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#name=zhang&", "id=1"), "https://sa-token.cc#name=zhang&id=1");
// 重载方法测试
- Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#name=zhang&", "id", 1), "https://sa-token.dev33.cn#name=zhang&id=1");
+ Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#name=zhang&", "id", 1), "https://sa-token.cc#name=zhang&id=1");
// url或key为null时,不拼接
Assertions.assertEquals(SaFoxUtil.joinSharpParam(null, "id", 1), null);
- Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", null, 1), "https://sa-token.dev33.cn");
+ Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", null, 1), "https://sa-token.cc");
// value为null时,会拼接出一个null字符串
- Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", "id", null), "https://sa-token.dev33.cn#id=null");
+ Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", "id", null), "https://sa-token.cc#id=null");
}
@Test
@@ -233,7 +233,7 @@ public class SaFoxUtilTest {
@Test
public void isUrl() {
- Assertions.assertTrue(SaFoxUtil.isUrl("https://sa-token.dev33.cn"));
+ Assertions.assertTrue(SaFoxUtil.isUrl("https://sa-token.cc"));
Assertions.assertTrue(SaFoxUtil.isUrl("https://www.baidu.com/"));
Assertions.assertFalse(SaFoxUtil.isUrl(null));
@@ -246,8 +246,8 @@ public class SaFoxUtilTest {
@Test
public void encodeUrl() {
- Assertions.assertEquals(SaFoxUtil.encodeUrl("https://sa-token.dev33.cn"), "https%3A%2F%2Fsa-token.dev33.cn");
- Assertions.assertEquals(SaFoxUtil.decoderUrl("https%3A%2F%2Fsa-token.dev33.cn"), "https://sa-token.dev33.cn");
+ Assertions.assertEquals(SaFoxUtil.encodeUrl("https://sa-token.cc"), "https%3A%2F%2Fsa-token.cc");
+ Assertions.assertEquals(SaFoxUtil.decoderUrl("https%3A%2F%2Fsa-token.cc"), "https://sa-token.cc");
}
@Test