From 713e11482cd1d8ba1e6298541b28d26aa5f4ea24 Mon Sep 17 00:00:00 2001
From: click33 <2393584716@qq.com>
Date: Tue, 28 Sep 2021 23:57:56 +0800
Subject: [PATCH] =?UTF-8?q?=E5=BA=9F=E5=BC=83=20SaTokenAction=20=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3=EF=BC=8C=E6=96=B0=E5=A2=9E=20SaStrategy=20=E7=AD=96?=
=?UTF-8?q?=E7=95=A5=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../main/java/cn/dev33/satoken/SaManager.java | 15 +-
.../dev33/satoken/action/SaTokenAction.java | 9 ++
.../action/SaTokenActionDefaultImpl.java | 4 +-
.../satoken/session/SaSessionCustomUtil.java | 3 +-
.../cn/dev33/satoken/sso/SaSsoTemplate.java | 3 +-
.../java/cn/dev33/satoken/stp/StpLogic.java | 19 ++-
.../cn/dev33/satoken/strategy/SaStrategy.java | 143 ++++++++++++++++++
.../dev33/satoken/temp/SaTempInterface.java | 3 +-
.../java/com/pj/satoken/SaTokenConfigure.java | 46 +++++-
.../com/pj/satoken/at/MySaTokenAction.java | 52 -------
.../oauth2/logic/SaOAuth2Template.java | 3 +-
.../cn/dev33/satoken/aop/SaCheckAspect.java | 4 +-
.../satoken/reactor/spring/SaBeanInject.java | 3 +-
.../cn/dev33/satoken/solon/XPluginImp.java | 1 +
.../integration/SaTokenMethodInterceptor.java | 7 +-
.../interceptor/SaAnnotationInterceptor.java | 4 +-
.../cn/dev33/satoken/spring/SaBeanInject.java | 3 +-
17 files changed, 234 insertions(+), 88 deletions(-)
create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaStrategy.java
delete mode 100644 sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/satoken/at/MySaTokenAction.java
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java b/sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java
index 4074d5b3..850fa360 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java
@@ -27,12 +27,13 @@ import cn.dev33.satoken.util.SaFoxUtil;
* @author kong
*
*/
+@SuppressWarnings("deprecation")
public class SaManager {
/**
* 配置文件 Bean
*/
- public static SaTokenConfig config;
+ public volatile static SaTokenConfig config;
public static void setConfig(SaTokenConfig config) {
SaManager.config = config;
if(config.getIsPrint()) {
@@ -55,7 +56,7 @@ public class SaManager {
/**
* 持久化 Bean
*/
- private static SaTokenDao saTokenDao;
+ private volatile static SaTokenDao saTokenDao;
public static void setSaTokenDao(SaTokenDao saTokenDao) {
if((SaManager.saTokenDao instanceof SaTokenDaoDefaultImpl)) {
((SaTokenDaoDefaultImpl)SaManager.saTokenDao).endRefreshThread();
@@ -76,7 +77,7 @@ public class SaManager {
/**
* 权限认证 Bean
*/
- private static StpInterface stpInterface;
+ private volatile static StpInterface stpInterface;
public static void setStpInterface(StpInterface stpInterface) {
SaManager.stpInterface = stpInterface;
}
@@ -94,7 +95,7 @@ public class SaManager {
/**
* 框架行为 Bean
*/
- private static SaTokenAction saTokenAction;
+ private volatile static SaTokenAction saTokenAction;
public static void setSaTokenAction(SaTokenAction saTokenAction) {
SaManager.saTokenAction = saTokenAction;
}
@@ -112,7 +113,7 @@ public class SaManager {
/**
* 容器操作 Bean
*/
- private static SaTokenContext saTokenContext;
+ private volatile static SaTokenContext saTokenContext;
public static void setSaTokenContext(SaTokenContext saTokenContext) {
SaManager.saTokenContext = saTokenContext;
}
@@ -130,7 +131,7 @@ public class SaManager {
/**
* 侦听器 Bean
*/
- private static SaTokenListener saTokenListener;
+ private volatile static SaTokenListener saTokenListener;
public static void setSaTokenListener(SaTokenListener saTokenListener) {
SaManager.saTokenListener = saTokenListener;
}
@@ -148,7 +149,7 @@ public class SaManager {
/**
* 临时令牌验证模块 Bean
*/
- private static SaTempInterface saTemp;
+ private volatile static SaTempInterface saTemp;
public static void setSaTemp(SaTempInterface saTemp) {
SaManager.saTemp = saTemp;
}
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenAction.java b/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenAction.java
index 0936d6ea..81b5eed0 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenAction.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenAction.java
@@ -1,5 +1,6 @@
package cn.dev33.satoken.action;
+import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;
import java.util.List;
@@ -8,9 +9,11 @@ import cn.dev33.satoken.session.SaSession;
/**
* Sa-Token 逻辑代理接口
*
此接口将会代理框架内部的一些关键性逻辑,方便开发者进行按需重写
+ * v1.27+ 此接口已废弃,目前版本暂时向下兼容,请更换为 SaStrategy
* @author kong
*
*/
+@Deprecated
public interface SaTokenAction {
/**
@@ -42,4 +45,10 @@ public interface SaTokenAction {
*/
public void checkMethodAnnotation(Method method);
+ /**
+ * 从指定元素校验注解
+ * @param target /
+ */
+ public void validateAnnotation(AnnotatedElement target);
+
}
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java b/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java
index 11a5d287..122de0a9 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java
@@ -18,9 +18,11 @@ import cn.dev33.satoken.util.SaTokenConsts;
/**
* Sa-Token 逻辑代理接口 [默认实现类]
+ *
v1.27+ 此接口已废弃,目前版本暂时向下兼容,请更换为 SaStrategy
* @author kong
*
*/
+@Deprecated
public class SaTokenActionDefaultImpl implements SaTokenAction {
/**
@@ -110,7 +112,7 @@ public class SaTokenActionDefaultImpl implements SaTokenAction {
* 从指定元素校验注解
* @param target see note
*/
- protected void validateAnnotation(AnnotatedElement target) {
+ public void validateAnnotation(AnnotatedElement target) {
// 校验 @SaCheckLogin 注解
if(target.isAnnotationPresent(SaCheckLogin.class)) {
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java
index 21c6ec9d..bb787c02 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java
@@ -1,6 +1,7 @@
package cn.dev33.satoken.session;
import cn.dev33.satoken.SaManager;
+import cn.dev33.satoken.strategy.SaStrategy;
/**
* 自定义Session工具类
@@ -45,7 +46,7 @@ public class SaSessionCustomUtil {
public static SaSession getSessionById(String sessionId, boolean isCreate) {
SaSession session = SaManager.getSaTokenDao().getSession(splicingSessionKey(sessionId));
if (session == null && isCreate) {
- session = SaManager.getSaTokenAction().createSession(splicingSessionKey(sessionId));
+ session = SaStrategy.me.createSession.apply(splicingSessionKey(sessionId));
SaManager.getSaTokenDao().setSession(session, SaManager.getConfig().getTimeout());
}
return session;
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java b/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java
index a30656ee..e7736cf4 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java
@@ -11,6 +11,7 @@ import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.sso.SaSsoConsts.ParamName;
import cn.dev33.satoken.stp.StpLogic;
+import cn.dev33.satoken.strategy.SaStrategy;
import cn.dev33.satoken.util.SaFoxUtil;
/**
@@ -213,7 +214,7 @@ public class SaSsoTemplate {
// 3、是否在[允许地址列表]之中
List authUrlList = Arrays.asList(getAllowUrl().replaceAll(" ", "").split(","));
- if(SaManager.getSaTokenAction().hasElement(authUrlList, url) == false) {
+ if(SaStrategy.me.hasElement.apply(authUrlList, url) == false) {
throw new SaTokenException("非法redirect:" + url);
}
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 6d1d9739..bd714216 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
@@ -25,6 +25,7 @@ import cn.dev33.satoken.exception.NotSafeException;
import cn.dev33.satoken.fun.SaFunction;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.session.TokenSign;
+import cn.dev33.satoken.strategy.SaStrategy;
import cn.dev33.satoken.util.SaFoxUtil;
import cn.dev33.satoken.util.SaTokenConsts;
@@ -85,7 +86,7 @@ public class StpLogic {
* @return 生成的tokenValue
*/
public String createTokenValue(Object loginId) {
- return SaManager.getSaTokenAction().createToken(loginId, loginType);
+ return SaStrategy.me.createToken.apply(loginId, loginType);
}
/**
@@ -539,7 +540,7 @@ public class StpLogic {
public SaSession getSessionBySessionId(String sessionId, boolean isCreate) {
SaSession session = SaManager.getSaTokenDao().getSession(sessionId);
if(session == null && isCreate) {
- session = SaManager.getSaTokenAction().createSession(sessionId);
+ session = SaStrategy.me.createSession.apply(sessionId);
SaManager.getSaTokenDao().setSession(session, getConfig().getTimeout());
}
return session;
@@ -842,8 +843,7 @@ public class StpLogic {
*/
public boolean hasRole(Object loginId, String role) {
List roleList = SaManager.getStpInterface().getRoleList(loginId, loginType);
- return SaManager.getSaTokenAction().hasElement(roleList, role);
-// return !(roleList == null || roleList.contains(role) == false);
+ return SaStrategy.me.hasElement.apply(roleList, role);
}
/**
@@ -873,7 +873,7 @@ public class StpLogic {
Object loginId = getLoginId();
List roleList = SaManager.getStpInterface().getRoleList(loginId, loginType);
for (String role : roleArray) {
- if(!SaManager.getSaTokenAction().hasElement(roleList, role)) {
+ if(!SaStrategy.me.hasElement.apply(roleList, role)) {
throw new NotRoleException(role, this.loginType);
}
}
@@ -887,7 +887,7 @@ public class StpLogic {
Object loginId = getLoginId();
List roleList = SaManager.getStpInterface().getRoleList(loginId, loginType);
for (String role : roleArray) {
- if(SaManager.getSaTokenAction().hasElement(roleList, role)) {
+ if(SaStrategy.me.hasElement.apply(roleList, role)) {
// 有的话提前退出
return;
}
@@ -908,8 +908,7 @@ public class StpLogic {
*/
public boolean hasPermission(Object loginId, String permission) {
List permissionList = SaManager.getStpInterface().getPermissionList(loginId, loginType);
- return SaManager.getSaTokenAction().hasElement(permissionList, permission);
-// return !(permissionList == null || permissionList.contains(permission) == false);
+ return SaStrategy.me.hasElement.apply(permissionList, permission);
}
/**
@@ -939,7 +938,7 @@ public class StpLogic {
Object loginId = getLoginId();
List permissionList = SaManager.getStpInterface().getPermissionList(loginId, loginType);
for (String permission : permissionArray) {
- if(!SaManager.getSaTokenAction().hasElement(permissionList, permission)) {
+ if(!SaStrategy.me.hasElement.apply(permissionList, permission)) {
throw new NotPermissionException(permission, this.loginType);
}
}
@@ -953,7 +952,7 @@ public class StpLogic {
Object loginId = getLoginId();
List permissionList = SaManager.getStpInterface().getPermissionList(loginId, loginType);
for (String permission : permissionArray) {
- if(SaManager.getSaTokenAction().hasElement(permissionList, permission)) {
+ if(SaStrategy.me.hasElement.apply(permissionList, permission)) {
// 有的话提前退出
return;
}
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaStrategy.java b/sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaStrategy.java
new file mode 100644
index 00000000..9fb0e697
--- /dev/null
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaStrategy.java
@@ -0,0 +1,143 @@
+package cn.dev33.satoken.strategy;
+
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Method;
+import java.util.List;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import cn.dev33.satoken.SaManager;
+import cn.dev33.satoken.session.SaSession;
+
+/**
+ * Sa-Token 策略对象
+ *
+ * 此类统一定义框架内的一些关键性逻辑算法,方便开发者进行按需重写
+ *
+ *
+ * @author kong
+ *
+ */
+@SuppressWarnings("deprecation")
+public final class SaStrategy {
+
+ private SaStrategy() {
+ }
+
+ /**
+ * 获取 SaStrategy 对象的单例引用
+ */
+ public static final SaStrategy me = new SaStrategy();
+
+ //
+ // 所有策略
+ //
+
+ /**
+ * 创建 Token 的策略
+ * 参数 [账号id, 账号类型]
+ */
+ public BiFunction