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"); } //路径规则处理