diff --git a/pom.xml b/pom.xml
index ba6396bf..b295d155 100644
--- a/pom.xml
+++ b/pom.xml
@@ -50,7 +50,7 @@
2.11.2
3.1.0
3.0.9.RELEASE
- 1.10.4
+ 1.10.9
1.9.1
1.4.3
4.9.17
diff --git a/sa-token-demo/sa-token-demo-solon/pom.xml b/sa-token-demo/sa-token-demo-solon/pom.xml
index 81b5dafd..2b61def6 100644
--- a/sa-token-demo/sa-token-demo-solon/pom.xml
+++ b/sa-token-demo/sa-token-demo-solon/pom.xml
@@ -18,7 +18,7 @@
org.noear
solon-web
- 1.10.4
+ ${solon.version}
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 2e7bc4ca..ba1770e1 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
@@ -5,12 +5,6 @@ import org.noear.solon.core.AopContext;
import org.noear.solon.core.Plugin;
import cn.dev33.satoken.SaManager;
-import cn.dev33.satoken.annotation.SaCheckBasic;
-import cn.dev33.satoken.annotation.SaCheckDisable;
-import cn.dev33.satoken.annotation.SaCheckLogin;
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.dev33.satoken.annotation.SaCheckRole;
-import cn.dev33.satoken.annotation.SaCheckSafe;
import cn.dev33.satoken.basic.SaBasicTemplate;
import cn.dev33.satoken.basic.SaBasicUtil;
import cn.dev33.satoken.config.SaTokenConfig;
@@ -23,7 +17,6 @@ import cn.dev33.satoken.listener.SaTokenEventCenter;
import cn.dev33.satoken.listener.SaTokenListener;
import cn.dev33.satoken.same.SaSameTemplate;
import cn.dev33.satoken.sign.SaSignTemplate;
-import cn.dev33.satoken.solon.integration.SaTokenAnnotationInterceptor;
import cn.dev33.satoken.solon.model.SaContextForSolon;
import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpLogic;
@@ -36,16 +29,9 @@ import cn.dev33.satoken.temp.SaTempInterface;
*/
@SuppressWarnings("deprecation")
public class XPluginImp implements Plugin {
-
- @Override
- public void start(AopContext context) {
- context.beanAroundAdd(SaCheckPermission.class, SaTokenAnnotationInterceptor.INSTANCE);
- context.beanAroundAdd(SaCheckRole.class, SaTokenAnnotationInterceptor.INSTANCE);
- context.beanAroundAdd(SaCheckLogin.class, SaTokenAnnotationInterceptor.INSTANCE);
- context.beanAroundAdd(SaCheckSafe.class, SaTokenAnnotationInterceptor.INSTANCE);
- context.beanAroundAdd(SaCheckDisable.class, SaTokenAnnotationInterceptor.INSTANCE);
- context.beanAroundAdd(SaCheckBasic.class, SaTokenAnnotationInterceptor.INSTANCE);
+ @Override
+ public void start(AopContext context) {
//集成初始化
// 注入上下文Bean
@@ -55,72 +41,70 @@ public class XPluginImp implements Plugin {
SaTokenConfig saTokenConfig = Solon.cfg().getBean("sa-token", SaTokenConfig.class);
SaManager.setConfig(saTokenConfig);
- context.getWrapAsyn(SaTokenConfig.class, bw -> {
- SaManager.setConfig(bw.raw());
+ context.getBeanAsyn(SaTokenConfig.class, bean -> {
+ SaManager.setConfig(bean);
});
// 注入Dao Bean
- context.getWrapAsyn(SaTokenDao.class, bw -> {
- SaManager.setSaTokenDao(bw.raw());
+ context.getBeanAsyn(SaTokenDao.class, bean -> {
+ SaManager.setSaTokenDao(bean);
});
// 注入二级上下文 Bean
- context.getWrapAsyn(SaTokenSecondContextCreator.class, bw->{
- SaTokenSecondContextCreator raw = bw.raw();
- SaManager.setSaTokenSecondContext(raw.create());
+ context.getBeanAsyn(SaTokenSecondContextCreator.class, bean -> {
+ SaManager.setSaTokenSecondContext(bean.create());
});
// 注入侦听器 Bean
- context.subBean(SaTokenListener.class, sl->{
+ context.subBean(SaTokenListener.class, sl -> {
SaTokenEventCenter.registerListener(sl);
});
// 注入权限认证 Bean
- context.getWrapAsyn(StpInterface.class, bw->{
- SaManager.setStpInterface(bw.raw());
+ context.getBeanAsyn(StpInterface.class, bean -> {
+ SaManager.setStpInterface(bean);
});
// 注入持久化 Bean
- context.getWrapAsyn(SaTokenDao.class, bw->{
- SaManager.setSaTokenDao(bw.raw());
+ context.getBeanAsyn(SaTokenDao.class, bean -> {
+ SaManager.setSaTokenDao(bean);
});
// 临时令牌验证模块 Bean
- context.getWrapAsyn(SaTempInterface.class, bw->{
- SaManager.setSaTemp(bw.raw());
+ context.getBeanAsyn(SaTempInterface.class, bean -> {
+ SaManager.setSaTemp(bean);
});
// Sa-Token-Id 身份凭证模块 Bean
- context.getWrapAsyn(SaIdTemplate.class, bw->{
- SaIdUtil.saIdTemplate = bw.raw();
+ context.getBeanAsyn(SaIdTemplate.class, bean -> {
+ SaIdUtil.saIdTemplate = bean;
});
// Sa-Token Same-Token 模块 Bean
- context.getWrapAsyn(SaSameTemplate.class, bw->{
- SaManager.setSaSignTemplate(bw.raw());
+ context.getBeanAsyn(SaSameTemplate.class, bean -> {
+ SaManager.setSaSameTemplate(bean);
});
// Sa-Token Http Basic 认证模块 Bean
- context.getWrapAsyn(SaBasicTemplate.class, bw->{
- SaBasicUtil.saBasicTemplate = bw.raw();
+ context.getBeanAsyn(SaBasicTemplate.class, bean -> {
+ SaBasicUtil.saBasicTemplate = bean;
});
// Sa-Token JSON 转换器 Bean
- context.getWrapAsyn(SaJsonTemplate.class, bw->{
- SaManager.setSaJsonTemplate(bw.raw());
+ context.getBeanAsyn(SaJsonTemplate.class, bean -> {
+ SaManager.setSaJsonTemplate(bean);
});
// Sa-Token 参数签名算法 Bean
- context.getWrapAsyn(SaSignTemplate.class, bw->{
- SaManager.setSaSignTemplate(bw.raw());
+ context.getBeanAsyn(SaSignTemplate.class, bean -> {
+ SaManager.setSaSignTemplate(bean);
});
// 自定义 StpLogic 对象
- context.getWrapAsyn(StpLogic.class, bw->{
- StpUtil.setStpLogic(bw.raw());
+ context.getBeanAsyn(StpLogic.class, bean -> {
+ StpUtil.setStpLogic(bean);
});
}
-
}
\ No newline at end of file
diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenAnnotationInterceptor.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenAnnotationInterceptor.java
deleted file mode 100644
index e6b1ac81..00000000
--- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenAnnotationInterceptor.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package cn.dev33.satoken.solon.integration;
-
-import cn.dev33.satoken.annotation.SaIgnore;
-import cn.dev33.satoken.strategy.SaStrategy;
-import org.noear.solon.core.aspect.Interceptor;
-import org.noear.solon.core.aspect.Invocation;
-import org.noear.solon.core.handle.Context;
-
-import java.lang.reflect.Method;
-
-/**
- * @author noear
- * @since 1.4
- * @deprecated 1.10,改用 SaTokenPathInterceptor
- */
-@Deprecated
-public class SaTokenAnnotationInterceptor implements Interceptor {
-
- public static final SaTokenAnnotationInterceptor INSTANCE = new SaTokenAnnotationInterceptor();
-
- @Override
- public Object doIntercept(Invocation inv) throws Throwable {
- // 如果此 Method 或其所属 Class 标注了 @SaIgnore,则忽略掉鉴权
- Context ctx = Context.current();
-
- if (ctx != null && "1".equals(ctx.attr("_SaTokenPathInterceptor"))) {
- // 执行原有逻辑
- return inv.invoke();
- } else {
-
- Method method = inv.method().getMethod();
- if (SaStrategy.me.isAnnotationPresent.apply(method, SaIgnore.class) == false) {
- SaStrategy.me.checkMethodAnnotation.accept(method);
- }
-
- // 执行原有逻辑
- return inv.invoke();
- }
- }
-}
\ No newline at end of file
diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenPathFilter.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenPathFilter.java
index dc07e187..9814ccf0 100644
--- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenPathFilter.java
+++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenPathFilter.java
@@ -1,197 +1,215 @@
package cn.dev33.satoken.solon.integration;
+import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.exception.BackResultException;
import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.exception.StopMatchException;
import cn.dev33.satoken.filter.SaFilterAuthStrategy;
import cn.dev33.satoken.filter.SaFilterErrorStrategy;
import cn.dev33.satoken.router.SaRouter;
-import org.noear.solon.Utils;
-import org.noear.solon.core.handle.Context;
-import org.noear.solon.core.handle.Filter;
-import org.noear.solon.core.handle.FilterChain;
+import cn.dev33.satoken.strategy.SaStrategy;
+import org.noear.solon.Solon;
+import org.noear.solon.core.handle.*;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
- * sa-token 基于路由的过滤式鉴权( +SaTokenAnnotationInterceptor )
+ * sa-token 基于路由的过滤式鉴权(增加了注解的处理);使用优先级要低些
*
* @author noear
- * @since 1.9
- * @deprecated 1.10,改用 SaTokenPathInterceptor
- * @see SaTokenPathInterceptor
+ * @since 1.10
*/
-@Deprecated
public class SaTokenPathFilter implements Filter {
+ /**
+ * 是否打开注解鉴权
+ */
+ public boolean isAnnotation = true;
- // ------------------------ 设置此过滤器 拦截 & 放行 的路由
+ // ------------------------ 设置此过滤器 拦截 & 放行 的路由
- /**
- * 拦截路由
- */
- protected List includeList = new ArrayList<>();
+ /**
+ * 拦截路由
+ */
+ protected List includeList = new ArrayList<>();
- /**
- * 放行路由
- */
- protected List excludeList = new ArrayList<>();
+ /**
+ * 放行路由
+ */
+ protected List excludeList = new ArrayList<>();
- /**
- * 添加 [拦截路由]
- *
- * @param paths 路由
- * @return 对象自身
- */
- public SaTokenPathFilter addInclude(String... paths) {
- includeList.addAll(Arrays.asList(paths));
- return this;
- }
+ /**
+ * 添加 [拦截路由]
+ *
+ * @param paths 路由
+ * @return 对象自身
+ */
+ public SaTokenPathFilter addInclude(String... paths) {
+ includeList.addAll(Arrays.asList(paths));
+ return this;
+ }
- /**
- * 添加 [放行路由]
- *
- * @param paths 路由
- * @return 对象自身
- */
- public SaTokenPathFilter addExclude(String... paths) {
- excludeList.addAll(Arrays.asList(paths));
- return this;
- }
+ /**
+ * 添加 [放行路由]
+ *
+ * @param paths 路由
+ * @return 对象自身
+ */
+ public SaTokenPathFilter addExclude(String... paths) {
+ excludeList.addAll(Arrays.asList(paths));
+ return this;
+ }
- /**
- * 写入 [拦截路由] 集合
- *
- * @param pathList 路由集合
- * @return 对象自身
- */
- public SaTokenPathFilter setIncludeList(List pathList) {
- includeList = pathList;
- return this;
- }
+ /**
+ * 写入 [拦截路由] 集合
+ *
+ * @param pathList 路由集合
+ * @return 对象自身
+ */
+ public SaTokenPathFilter setIncludeList(List pathList) {
+ includeList = pathList;
+ return this;
+ }
- /**
- * 写入 [放行路由] 集合
- *
- * @param pathList 路由集合
- * @return 对象自身
- */
- public SaTokenPathFilter setExcludeList(List pathList) {
- excludeList = pathList;
- return this;
- }
+ /**
+ * 写入 [放行路由] 集合
+ *
+ * @param pathList 路由集合
+ * @return 对象自身
+ */
+ public SaTokenPathFilter setExcludeList(List pathList) {
+ excludeList = pathList;
+ return this;
+ }
- /**
- * 获取 [拦截路由] 集合
- *
- * @return see note
- */
- public List getIncludeList() {
- return includeList;
- }
+ /**
+ * 获取 [拦截路由] 集合
+ *
+ * @return see note
+ */
+ public List getIncludeList() {
+ return includeList;
+ }
- /**
- * 获取 [放行路由] 集合
- *
- * @return see note
- */
- public List getExcludeList() {
- return excludeList;
- }
+ /**
+ * 获取 [放行路由] 集合
+ *
+ * @return see note
+ */
+ public List getExcludeList() {
+ return excludeList;
+ }
- // ------------------------ 钩子函数
+ // ------------------------ 钩子函数
- /**
- * 认证函数:每次请求执行
- */
- protected SaFilterAuthStrategy auth = r -> {
- };
+ /**
+ * 认证函数:每次请求执行
+ */
+ protected SaFilterAuthStrategy auth = r -> {
+ };
- /**
- * 异常处理函数:每次[认证函数]发生异常时执行此函数
- */
- protected SaFilterErrorStrategy error = e -> {
- if (e instanceof SaTokenException) {
- throw (SaTokenException) e;
- } else {
- throw new SaTokenException(e);
- }
- };
+ /**
+ * 异常处理函数:每次[认证函数]发生异常时执行此函数
+ */
+ protected SaFilterErrorStrategy error = e -> {
+ if (e instanceof SaTokenException) {
+ throw (SaTokenException) e;
+ } else {
+ throw new SaTokenException(e);
+ }
+ };
- /**
- * 前置函数:在每次[认证函数]之前执行
- */
- protected SaFilterAuthStrategy beforeAuth = r -> {
- };
+ /**
+ * 前置函数:在每次[认证函数]之前执行
+ */
+ protected SaFilterAuthStrategy beforeAuth = r -> {
+ };
- /**
- * 写入[认证函数]: 每次请求执行
- *
- * @param auth see note
- * @return 对象自身
- */
- public SaTokenPathFilter setAuth(SaFilterAuthStrategy auth) {
- this.auth = auth;
- return this;
- }
+ /**
+ * 写入[认证函数]: 每次请求执行
+ *
+ * @param auth see note
+ * @return 对象自身
+ */
+ public SaTokenPathFilter setAuth(SaFilterAuthStrategy auth) {
+ this.auth = auth;
+ return this;
+ }
- /**
- * 写入[异常处理函数]:每次[认证函数]发生异常时执行此函数
- *
- * @param error see note
- * @return 对象自身
- */
- public SaTokenPathFilter setError(SaFilterErrorStrategy error) {
- this.error = error;
- return this;
- }
+ /**
+ * 写入[异常处理函数]:每次[认证函数]发生异常时执行此函数
+ *
+ * @param error see note
+ * @return 对象自身
+ */
+ public SaTokenPathFilter setError(SaFilterErrorStrategy error) {
+ this.error = error;
+ return this;
+ }
- /**
- * 写入[前置函数]:在每次[认证函数]之前执行
- *
- * @param beforeAuth see note
- * @return 对象自身
- */
- public SaTokenPathFilter setBeforeAuth(SaFilterAuthStrategy beforeAuth) {
- this.beforeAuth = beforeAuth;
- return this;
- }
+ /**
+ * 写入[前置函数]:在每次[认证函数]之前执行
+ *
+ * @param beforeAuth see note
+ * @return 对象自身
+ */
+ public SaTokenPathFilter setBeforeAuth(SaFilterAuthStrategy beforeAuth) {
+ this.beforeAuth = beforeAuth;
+ return this;
+ }
- @Override
- public void doFilter(Context ctx, FilterChain chain) throws Throwable {
- try {
- // 执行全局过滤器
- SaRouter.match(includeList).notMatch(excludeList).check(r -> {
- beforeAuth.run(null);
- auth.run(null);
- });
+ @Override
+ public void doFilter(Context ctx, FilterChain chain) throws Throwable {
+ try {
+ //查找当前主处理
+ Handler mainHandler = Solon.app().router().matchMain(ctx);
- } catch (StopMatchException e) {
+ //如果是静态文件,则不处理(静态文件,不在路由中)
+ if (mainHandler != null) {
+ Action action = (mainHandler instanceof Action ? (Action) mainHandler : null);
- } catch (SaTokenException e) {
- // 1. 获取异常处理策略结果
- Object result;
- if (e instanceof BackResultException) {
- result = e.getMessage();
- } else {
- result = error.run(e);
- }
+ if (isAnnotation && action != null) {
+ // 获取此请求对应的 Method 处理函数
+ Method method = action.method().getMethod();
- // 2. 写入输出流
- if(result != null) {
- ctx.render(result);
- }
- ctx.setHandled(true);
- return;
- } catch (Throwable e) {
- // 异常解包
- throw Utils.throwableUnwrap(e); //solon 的最后层还有保底处理
- }
+ // 如果此 Method 或其所属 Class 标注了 @SaIgnore,则忽略掉鉴权
+ if (SaStrategy.me.isAnnotationPresent.apply(method, SaIgnore.class)) {
+ return;
+ }
- // 执行
- chain.doFilter(ctx);
- }
-}
\ No newline at end of file
+ // 注解校验
+ SaStrategy.me.checkMethodAnnotation.accept(method);
+ }
+
+ //路径规则处理
+ SaRouter.match(includeList).notMatch(excludeList).check(r -> {
+ beforeAuth.run(mainHandler);
+ auth.run(mainHandler);
+ });
+ }
+ } catch (StopMatchException e) {
+
+ } catch (SaTokenException e) {
+ // 1. 获取异常处理策略结果
+ Object result;
+ if (e instanceof BackResultException) {
+ result = e.getMessage();
+ } else {
+ result = error.run(e);
+ }
+
+ // 2. 写入输出流
+ if (result != null) {
+ ctx.render(result);
+ }
+ ctx.setHandled(true);
+ return;
+ }
+
+ chain.doFilter(ctx);
+ }
+}
diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenPathInterceptor.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenPathInterceptor.java
index 2d32ac6a..2478882d 100644
--- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenPathInterceptor.java
+++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenPathInterceptor.java
@@ -18,10 +18,8 @@ import java.util.Arrays;
import java.util.List;
/**
- * sa-token 基于路由的拦截式鉴权(增加了注解的处理)
+ * sa-token 基于路由的拦截式鉴权(增加了注解的处理);使用优先级要高些
*
- * @author kong
- * @since 1.9
* @author noear
* @since 1.10
*/
@@ -172,8 +170,6 @@ public class SaTokenPathInterceptor implements Handler {
Action action = ctx.action();
if(isAnnotation && action != null){
- ctx.attrSet("_SaTokenPathInterceptor", "1");
-
// 获取此请求对应的 Method 处理函数
Method method = action.method().getMethod();
@@ -184,8 +180,6 @@ public class SaTokenPathInterceptor implements Handler {
// 注解校验
SaStrategy.me.checkMethodAnnotation.accept(method);
- }else{
- ctx.attrSet("_SaTokenPathInterceptor", "0");
}
//路径规则处理