From cf6632df7946625e08c6f2cf16792fdad260bf54 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Mon, 4 Oct 2021 17:58:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=BC=BA=20SaRouter=20=E9=93=BE?= =?UTF-8?q?=E5=BC=8F=E5=8C=B9=E9=85=8D=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/dev33/satoken/fun/SaParamFunction.java | 17 + .../dev33/satoken/fun/SaParamRetFunction.java | 18 + .../cn/dev33/satoken/router/SaHttpMethod.java | 62 ++++ .../cn/dev33/satoken/router/SaRouter.java | 298 +++++++++++++--- .../dev33/satoken/router/SaRouterStaff.java | 325 ++++++++++++++++++ .../cn/dev33/satoken/session/SaSession.java | 10 + .../java/cn/dev33/satoken/stp/StpLogic.java | 134 +++++--- .../java/cn/dev33/satoken/stp/StpUtil.java | 88 +++-- .../java/cn/dev33/satoken/util/SaFoxUtil.java | 25 ++ .../main/java/com/pj/test/TestController.java | 1 + sa-token-plugin/sa-token-temp-jwt/pom.xml | 4 +- .../reactor/filter/SaReactorFilter.java | 2 +- .../solon/integration/SaTokenPathFilter.java | 6 +- .../solon/model/SaResponseForSolon.java | 2 +- .../dev33/satoken/filter/SaServletFilter.java | 2 +- 15 files changed, 847 insertions(+), 147 deletions(-) create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/fun/SaParamFunction.java create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/fun/SaParamRetFunction.java create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/router/SaHttpMethod.java create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/router/SaRouterStaff.java diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/fun/SaParamFunction.java b/sa-token-core/src/main/java/cn/dev33/satoken/fun/SaParamFunction.java new file mode 100644 index 00000000..52442204 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/fun/SaParamFunction.java @@ -0,0 +1,17 @@ +package cn.dev33.satoken.fun; + +/** + * 设定一个函数,并传入一个参数,方便在Lambda表达式下的函数式编程 + * @author kong + * + */ +@FunctionalInterface +public interface SaParamFunction { + + /** + * 执行的方法 + * @param r 传入的参数 + */ + public void run(T r); + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/fun/SaParamRetFunction.java b/sa-token-core/src/main/java/cn/dev33/satoken/fun/SaParamRetFunction.java new file mode 100644 index 00000000..2e0536ff --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/fun/SaParamRetFunction.java @@ -0,0 +1,18 @@ +package cn.dev33.satoken.fun; + +/** + * 设定一个函数,传入一个参数,并返回一个值,方便在Lambda表达式下的函数式编程 + * @author kong + * + */ +@FunctionalInterface +public interface SaParamRetFunction { + + /** + * 执行的方法 + * @param param 传入的参数 + * @return 返回值 + */ + public R run(T param); + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/router/SaHttpMethod.java b/sa-token-core/src/main/java/cn/dev33/satoken/router/SaHttpMethod.java new file mode 100644 index 00000000..67d29256 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/router/SaHttpMethod.java @@ -0,0 +1,62 @@ +package cn.dev33.satoken.router; + +import java.util.HashMap; +import java.util.Map; + +import cn.dev33.satoken.exception.SaTokenException; + +/** + * Http 请求各种请求类型的枚举表示 + * + *

参考:Spring - HttpMethod + * + * @author kong + * + */ +public enum SaHttpMethod { + + GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE, CONNECT, + + /** + * 代表全部请求方式 + */ + ALL; + + private static final Map map = new HashMap<>(); + + static { + for (SaHttpMethod reqMethod : values()) { + map.put(reqMethod.name(), reqMethod); + } + } + + /** + * String 转 enum + * @param method 请求类型 + * @return ReqMethod 对象 + */ + public static SaHttpMethod toEnum(String method) { + if(method == null) { + throw new SaTokenException("无效Method:" + method); + } + SaHttpMethod reqMethod = map.get(method.toUpperCase()); + if(reqMethod == null) { + throw new SaTokenException("无效Method:" + method); + } + return reqMethod; + } + + /** + * String[] 转 enum[] + * @param methods 请求类型数组 + * @return ReqMethod 对象 + */ + public static SaHttpMethod[] toEnumArray(String... methods) { + SaHttpMethod [] arr = new SaHttpMethod[methods.length]; + for (int i = 0; i < methods.length; i++) { + arr[i] = SaHttpMethod.toEnum(methods[i]); + } + return arr; + } + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/router/SaRouter.java b/sa-token-core/src/main/java/cn/dev33/satoken/router/SaRouter.java index 4419efa6..9e668b1f 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/router/SaRouter.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/router/SaRouter.java @@ -1,14 +1,14 @@ package cn.dev33.satoken.router; -import java.util.Arrays; import java.util.List; import cn.dev33.satoken.SaManager; import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.exception.BackResultException; import cn.dev33.satoken.exception.StopMatchException; -import cn.dev33.satoken.fun.IsRunFunction; import cn.dev33.satoken.fun.SaFunction; +import cn.dev33.satoken.fun.SaParamFunction; +import cn.dev33.satoken.fun.SaParamRetFunction; /** * 路由匹配操作工具类 @@ -36,6 +36,9 @@ public class SaRouter { * @return 是否匹配成功 */ public static boolean isMatch(List patterns, String path) { + if(patterns == null) { + return false; + } for (String pattern : patterns) { if(isMatch(pattern, path)) { return true; @@ -44,6 +47,44 @@ public class SaRouter { return false; } + /** + * 路由匹配 + * @param patterns 路由匹配符数组 + * @param path 被匹配的路由 + * @return 是否匹配成功 + */ + public static boolean isMatch(String[] patterns, String path) { + if(patterns == null) { + return false; + } + for (String pattern : patterns) { + if(isMatch(pattern, path)) { + return true; + } + } + return false; + } + + /** + * Http请求方法匹配 + * @param methods Http请求方法断言数组 + * @param methodString Http请求方法 + * @return 是否匹配成功 + */ + public static boolean isMatch(SaHttpMethod[] methods, String methodString) { + if(methods == null) { + return false; + } + for (SaHttpMethod method : methods) { + if(method == SaHttpMethod.ALL || (method != null && method.toString().equalsIgnoreCase(methodString))) { + return true; + } + } + return false; + } + + // ------ 使用当前URI匹配 + /** * 路由匹配 (使用当前URI) * @param pattern 路由匹配符 @@ -61,40 +102,229 @@ public class SaRouter { public static boolean isMatchCurrURI(List patterns) { return isMatch(patterns, SaHolder.getRequest().getRequestPath()); } + + /** + * 路由匹配 (使用当前URI) + * @param patterns 路由匹配符数组 + * @return 是否匹配成功 + */ + public static boolean isMatchCurrURI(String[] patterns) { + return isMatch(patterns, SaHolder.getRequest().getRequestPath()); + } + + /** + * Http请求方法匹配 (使用当前请求方式) + * @param methods Http请求方法断言数组 + * @return 是否匹配成功 + */ + public static boolean isMatchCurrMethod(SaHttpMethod[] methods) { + return isMatch(methods, SaHolder.getRequest().getMethod()); + } - // -------------------- 执行相关 -------------------- + // -------------------- 开始匹配 -------------------- + + /** + * 初始化一个SaRouterStaff,开始匹配 + * @return SaRouterStaff + */ + public static SaRouterStaff newMatch() { + return new SaRouterStaff(); + } + + // ----------------- path匹配 + + /** + * 路由匹配 + * @param patterns 路由匹配符集合 + * @return SaRouterStaff + */ + public static SaRouterStaff match(String... patterns) { + return new SaRouterStaff().match(patterns); + } + + /** + * 路由匹配排除 + * @param patterns 路由匹配符排除数组 + * @return SaRouterStaff + */ + public static SaRouterStaff notMatch(String... patterns) { + return new SaRouterStaff().notMatch(patterns); + } + + /** + * 路由匹配 + * @param patterns 路由匹配符集合 + * @return 对象自身 + */ + public static SaRouterStaff match(List patterns) { + return new SaRouterStaff().match(patterns); + } + + /** + * 路由匹配排除 + * @param patterns 路由匹配符排除集合 + * @return 对象自身 + */ + public static SaRouterStaff notMatch(List patterns) { + return new SaRouterStaff().notMatch(patterns); + } + + // ----------------- Method匹配 + + /** + * Http请求方式匹配 (Enum) + * @param methods Http请求方法断言数组 + * @return SaRouterStaff + */ + public static SaRouterStaff match(SaHttpMethod... methods) { + return new SaRouterStaff().match(methods); + } + + /** + * Http请求方法匹配排除 (Enum) + * @param methods Http请求方法断言排除数组 + * @return SaRouterStaff + */ + public static SaRouterStaff notMatch(SaHttpMethod... methods) { + return new SaRouterStaff().notMatch(methods); + } + + /** + * Http请求方法匹配 (String) + * @param methods Http请求方法断言数组 + * @return SaRouterStaff + */ + public static SaRouterStaff matchMethod(String... methods) { + return new SaRouterStaff().matchMethod(methods); + } + + /** + * Http请求方法匹配排除 (String) + * @param methods Http请求方法断言排除数组 + * @return SaRouterStaff + */ + public static SaRouterStaff notMatchMethod(String... methods) { + return new SaRouterStaff().notMatchMethod(methods); + } + + // ----------------- 条件匹配 + + /** + * 根据 boolean 值进行匹配 + * @param flag boolean值 + * @return SaRouterStaff + */ + public static SaRouterStaff match(boolean flag) { + return new SaRouterStaff().match(flag); + } + + /** + * 根据 boolean 值进行匹配排除 + * @param flag boolean值 + * @return SaRouterStaff + */ + public static SaRouterStaff notMatch(boolean flag) { + return new SaRouterStaff().notMatch(flag); + } + + /** + * 根据自定义方法进行匹配 (lazy) + * @param fun 自定义方法 + * @return SaRouterStaff + */ + public static SaRouterStaff match(SaParamRetFunction fun) { + return new SaRouterStaff().match(fun); + } + + /** + * 根据自定义方法进行匹配排除 (lazy) + * @param fun 自定义排除方法 + * @return SaRouterStaff + */ + public static SaRouterStaff notMatch(SaParamRetFunction fun) { + return new SaRouterStaff().notMatch(fun); + } + + + // -------------------- 直接指定check函数 -------------------- /** * 路由匹配,如果匹配成功则执行认证函数 * @param pattern 路由匹配符 - * @param function 要执行的方法 + * @param fun 要执行的校验方法 */ - public static void match(String pattern, SaFunction function) { - if(isMatchCurrURI(pattern)) { - function.run(); - } + public static SaRouterStaff match(String pattern, SaFunction fun) { + return new SaRouterStaff().match(pattern, fun); + } + + /** + * 路由匹配,如果匹配成功则执行认证函数 + * @param pattern 路由匹配符 + * @param fun 要执行的校验方法 + */ + public static SaRouterStaff match(String pattern, SaParamFunction fun) { + return new SaRouterStaff().match(pattern, fun); } /** * 路由匹配 (并指定排除匹配符),如果匹配成功则执行认证函数 * @param pattern 路由匹配符 * @param excludePattern 要排除的路由匹配符 - * @param function 要执行的方法 + * @param fun 要执行的方法 */ - public static void match(String pattern, String excludePattern, SaFunction function) { - if(isMatchCurrURI(pattern)) { - if(isMatchCurrURI(excludePattern) == false) { - function.run(); - } - } + public static SaRouterStaff match(String pattern, String excludePattern, SaFunction fun) { + return new SaRouterStaff().match(pattern, excludePattern, fun); } /** + * 路由匹配 (并指定排除匹配符),如果匹配成功则执行认证函数 + * @param pattern 路由匹配符 + * @param excludePattern 要排除的路由匹配符 + * @param fun 要执行的方法 + */ + public static SaRouterStaff match(String pattern, String excludePattern, SaParamFunction fun) { + return new SaRouterStaff().match(pattern, excludePattern, fun); + } + + + // -------------------- 提前退出 -------------------- + + /** + * 停止匹配,跳出函数 (在多个匹配链中一次性跳出Auth函数) + * @return SaRouterStaff + */ + public static SaRouterStaff stop() { + throw new StopMatchException(); + } + + /** + * 停止匹配,结束执行,向前端返回结果 + * @return SaRouterStaff + */ + public static SaRouterStaff back() { + throw new BackResultException(""); + } + + /** + * 停止匹配,结束执行,向前端返回结果 + * @param result 要输出的结果 + * @return SaRouterStaff + */ + public static SaRouterStaff back(Object result) { + throw new BackResultException(result); + } + + + // -------------------- 历史API兼容 -------------------- + + /** + *

本函数设计已过时,请更换为:SaRouter.match(path...).ckeck(fun)

* 路由匹配,如果匹配成功则执行认证函数 * @param patterns 路由匹配符集合 * @param function 要执行的方法 */ + @Deprecated public static void match(List patterns, SaFunction function) { if(isMatchCurrURI(patterns)) { function.run(); @@ -102,11 +332,13 @@ public class SaRouter { } /** + *

本函数设计已过时,请更换为:SaRouter.match(path...).notMatch(path...).ckeck(fun)

* 路由匹配 (并指定排除匹配符),如果匹配成功则执行认证函数 * @param patterns 路由匹配符集合 * @param excludePatterns 要排除的路由匹配符集合 * @param function 要执行的方法 */ + @Deprecated public static void match(List patterns, List excludePatterns, SaFunction function) { if(isMatchCurrURI(patterns)) { if(isMatchCurrURI(excludePatterns) == false) { @@ -114,41 +346,5 @@ public class SaRouter { } } } - - - /** - * 路由匹配,如果匹配成功则执行认证函数 - * @param patterns 路由匹配符集合 - * @return 匹配结果包装对象 - */ - public static IsRunFunction match(String... patterns) { - boolean matchResult = isMatch(Arrays.asList(patterns), SaHolder.getRequest().getRequestPath()); - return new IsRunFunction(matchResult); - } - - // -------------------- 其它操作 -------------------- - - /** - * 停止匹配,跳出函数 (在多个匹配链中一次性跳出Auth函数) - */ - public static void stop() { - throw new StopMatchException(); - } - - /** - * 停止匹配,结束执行,向前端返回结果 - * @param result 要输出的结果 - */ - public static void back(Object result) { - throw new BackResultException(result); - } - - /** - * 停止匹配,结束执行,向前端返回结果 - */ - public static void back() { - throw new BackResultException(""); - } - } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/router/SaRouterStaff.java b/sa-token-core/src/main/java/cn/dev33/satoken/router/SaRouterStaff.java new file mode 100644 index 00000000..75018149 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/router/SaRouterStaff.java @@ -0,0 +1,325 @@ +package cn.dev33.satoken.router; + +import java.util.List; + +import cn.dev33.satoken.exception.BackResultException; +import cn.dev33.satoken.exception.StopMatchException; +import cn.dev33.satoken.fun.SaFunction; +import cn.dev33.satoken.fun.SaParamFunction; +import cn.dev33.satoken.fun.SaParamRetFunction; + +/** + * 路由匹配操作对象 + * + * @author kong + * + */ +public class SaRouterStaff { + + /** + * 是否命中的标记变量 + */ + public boolean isHit = true; + + /** + * @return 是否命中 + */ + public boolean isHit() { + return isHit; + } + + /** + * @param isHit 命中标记 + * @return 对象自身 + */ + public SaRouterStaff setHit(boolean isHit) { + this.isHit = isHit; + return this; + } + + /** + * 重置命中标记为 true + * @return 对象自身 + */ + public SaRouterStaff reset() { + this.isHit = true; + return this; + } + + + // ----------------- path匹配 + + /** + * 路由匹配 + * @param patterns 路由匹配符数组 + * @return 对象自身 + */ + public SaRouterStaff match(String... patterns) { + if(isHit) { + isHit = SaRouter.isMatchCurrURI(patterns); + } + return this; + } + + /** + * 路由匹配排除 + * @param patterns 路由匹配符排除数组 + * @return 对象自身 + */ + public SaRouterStaff notMatch(String... patterns) { + if(isHit) { + isHit = !SaRouter.isMatchCurrURI(patterns); + } + return this; + } + + /** + * 路由匹配 + * @param patterns 路由匹配符集合 + * @return 对象自身 + */ + public SaRouterStaff match(List patterns) { + if(isHit) { + isHit = SaRouter.isMatchCurrURI(patterns); + } + return this; + } + + /** + * 路由匹配排除 + * @param patterns 路由匹配符排除集合 + * @return 对象自身 + */ + public SaRouterStaff notMatch(List patterns) { + if(isHit) { + isHit = !SaRouter.isMatchCurrURI(patterns); + } + return this; + } + + // ----------------- Method匹配 + + /** + * Http请求方法匹配 (Enum) + * @param methods Http请求方法断言数组 + * @return 对象自身 + */ + public SaRouterStaff match(SaHttpMethod... methods) { + if(isHit) { + isHit = SaRouter.isMatchCurrMethod(methods); + } + return this; + } + + /** + * Http请求方法匹配排除 (Enum) + * @param methods Http请求方法断言排除数组 + * @return 对象自身 + */ + public SaRouterStaff notMatch(SaHttpMethod... methods) { + if(isHit) { + isHit = !SaRouter.isMatchCurrMethod(methods); + } + return this; + } + + /** + * Http请求方法匹配 (String) + * @param methods Http请求方法断言数组 + * @return 对象自身 + */ + public SaRouterStaff matchMethod(String... methods) { + if(isHit) { + SaHttpMethod [] arr = SaHttpMethod.toEnumArray(methods); + isHit = SaRouter.isMatchCurrMethod(arr); + } + return this; + } + + /** + * Http请求方法匹配排除 (String) + * @param methods Http请求方法断言排除数组 + * @return 对象自身 + */ + public SaRouterStaff notMatchMethod(String... methods) { + if(isHit) { + SaHttpMethod [] arr = SaHttpMethod.toEnumArray(methods); + isHit = !SaRouter.isMatchCurrMethod(arr); + } + return this; + } + + + // ----------------- 条件匹配 + + /** + * 根据 boolean 值进行匹配 + * @param flag boolean值 + * @return 对象自身 + */ + public SaRouterStaff match(boolean flag) { + if(isHit) { + isHit = flag; + } + return this; + } + + /** + * 根据 boolean 值进行匹配排除 + * @param flag boolean值 + * @return 对象自身 + */ + public SaRouterStaff notMatch(boolean flag) { + if(isHit) { + isHit = !flag; + } + return this; + } + + /** + * 根据自定义方法进行匹配 (lazy) + * @param fun 自定义方法 + * @return 对象自身 + */ + public SaRouterStaff match(SaParamRetFunction fun) { + if(isHit) { + isHit = fun.run(this); + } + return this; + } + + /** + * 根据自定义方法进行匹配排除 (lazy) + * @param fun 自定义排除方法 + * @return 对象自身 + */ + public SaRouterStaff notMatch(SaParamRetFunction fun) { + if(isHit) { + isHit = !fun.run(this); + } + return this; + } + + + // ----------------- 函数校验执行 + + /** + * 执行校验函数 (无参) + * @param fun 要执行的函数 + * @return 对象自身 + */ + public SaRouterStaff check(SaFunction fun) { + if(isHit) { + fun.run(); + } + return this; + } + + /** + * 执行校验函数 (带参) + * @param fun 要执行的函数 + * @return 对象自身 + */ + public SaRouterStaff check(SaParamFunction fun) { + if(isHit) { + fun.run(this); + } + return this; + } + + /** + * 自由匹配 ( 在free作用域里执行stop()不会跳出Auth函数,而是仅仅跳出free代码块 ) + * @param fun 要执行的函数 + * @return 对象自身 + */ + public SaRouterStaff free(SaParamFunction fun) { + if(isHit) { + try { + fun.run(this); + } catch (StopMatchException e) { + // 跳出 free自由匹配代码块 + } + } + return this; + } + + + // ----------------- 直接指定check函数 + + /** + * 路由匹配,如果匹配成功则执行认证函数 + * @param pattern 路由匹配符 + * @param fun 要执行的校验方法 + */ + public SaRouterStaff match(String pattern, SaFunction fun) { + return this.match(pattern).check(fun); + } + + /** + * 路由匹配,如果匹配成功则执行认证函数 + * @param pattern 路由匹配符 + * @param fun 要执行的校验方法 + */ + public SaRouterStaff match(String pattern, SaParamFunction fun) { + return this.match(pattern).check(fun); + } + + /** + * 路由匹配 (并指定排除匹配符),如果匹配成功则执行认证函数 + * @param pattern 路由匹配符 + * @param excludePattern 要排除的路由匹配符 + * @param fun 要执行的方法 + */ + public SaRouterStaff match(String pattern, String excludePattern, SaFunction fun) { + return this.match(pattern).notMatch(excludePattern).check(fun); + } + + /** + * 路由匹配 (并指定排除匹配符),如果匹配成功则执行认证函数 + * @param pattern 路由匹配符 + * @param excludePattern 要排除的路由匹配符 + * @param fun 要执行的方法 + */ + public SaRouterStaff match(String pattern, String excludePattern, SaParamFunction fun) { + return this.match(pattern).notMatch(excludePattern).check(fun); + } + + + // ----------------- 提前退出 + + /** + * 停止匹配,跳出函数 (在多个匹配链中一次性跳出Auth函数) + * @return 对象自身 + */ + public SaRouterStaff stop() { + if(isHit) { + throw new StopMatchException(); + } + return this; + } + + /** + * 停止匹配,结束执行,向前端返回结果 + * @return 对象自身 + */ + public SaRouterStaff back() { + if(isHit) { + throw new BackResultException(""); + } + return this; + } + + /** + * 停止匹配,结束执行,向前端返回结果 + * @return 对象自身 + * @param result 要输出的结果 + */ + public SaRouterStaff back(Object result) { + if(isHit) { + throw new BackResultException(result); + } + return this; + } + + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSession.java b/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSession.java index cacc0407..150ceca5 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSession.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSession.java @@ -20,7 +20,17 @@ import cn.dev33.satoken.util.SaFoxUtil; public class SaSession implements Serializable { private static final long serialVersionUID = 1L; + + /** + * 在 Session 上存储角色时建议使用的key + */ + public static final String ROLE_LIST = "ROLE_LIST"; + /** + * 在 Session 上存储权限时建议使用的key + */ + public static final String PERMISSION_LIST = "PERMISSION_LIST"; + /** 此Session的id */ private String id; 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 e47dd322..896d5d3f 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 @@ -957,26 +957,46 @@ public class StpLogic { // ------------------- 角色验证操作 ------------------- + /** + * 获取:当前账号的角色集合 + * @return / + */ + public List getRoleList() { + try { + return getRoleList(getLoginId()); + } catch (NotLoginException e) { + return SaFoxUtil.emptyList(); + } + } + + /** + * 获取:指定账号的角色集合 + * @param loginId 指定账号id + * @return / + */ + public List getRoleList(Object loginId) { + return SaManager.getStpInterface().getRoleList(loginId, loginType); + } + /** - * 判断:指定账号id是否含有指定角色标识, 返回true或false + * 判断:当前账号是否拥有指定角色, 返回true或false + * @param role 角色 + * @return / + */ + public boolean hasRole(String role) { + return hasElement(getRoleList(), role); + } + + /** + * 判断:指定账号是否含有指定角色标识, 返回true或false * @param loginId 账号id * @param role 角色标识 * @return 是否含有指定角色标识 */ public boolean hasRole(Object loginId, String role) { - List roleList = SaManager.getStpInterface().getRoleList(loginId, loginType); - return SaStrategy.me.hasElement.apply(roleList, role); + return hasElement(getRoleList(loginId), role); } - /** - * 判断:当前账号是否含有指定角色标识, 返回true或false - * @param role 角色标识 - * @return 是否含有指定角色标识 - */ - public boolean hasRole(String role) { - return isLogin() && hasRole(getLoginId(), role); - } - /** * 判断:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过] * @param roleArray 角色标识数组 @@ -1010,7 +1030,7 @@ public class StpLogic { * @param role 角色标识 */ public void checkRole(String role) { - if(!hasRole(role)) { + if(hasRole(role) == false) { throw new NotRoleException(role, this.loginType); } } @@ -1021,9 +1041,9 @@ public class StpLogic { */ public void checkRoleAnd(String... roleArray){ Object loginId = getLoginId(); - List roleList = SaManager.getStpInterface().getRoleList(loginId, loginType); + List roleList = getRoleList(loginId); for (String role : roleArray) { - if(!SaStrategy.me.hasElement.apply(roleList, role)) { + if(!hasElement(roleList, role)) { throw new NotRoleException(role, this.loginType); } } @@ -1035,10 +1055,10 @@ public class StpLogic { */ public void checkRoleOr(String... roleArray){ Object loginId = getLoginId(); - List roleList = SaManager.getStpInterface().getRoleList(loginId, loginType); + List roleList = getRoleList(loginId); for (String role : roleArray) { - if(SaStrategy.me.hasElement.apply(roleList, role)) { - // 有的话提前退出 + if(hasElement(roleList, role)) { + // 有的话提前退出 return; } } @@ -1047,19 +1067,39 @@ public class StpLogic { } } - // -- - /** - * 返回当前账号所拥有的角色标识集合 - * @return / - */ - public List getRoleList() { - return SaManager.getStpInterface().getRoleList(getLoginId(), loginType); - } - - // ------------------- 权限验证操作 ------------------- + /** + * 获取:当前账号的权限码集合 + * @return / + */ + public List getPermissionList() { + try { + return getPermissionList(getLoginId()); + } catch (NotLoginException e) { + return SaFoxUtil.emptyList(); + } + } + + /** + * 获取:指定账号的权限码集合 + * @param loginId 指定账号id + * @return / + */ + public List getPermissionList(Object loginId) { + return SaManager.getStpInterface().getPermissionList(loginId, loginType); + } + + /** + * 判断:当前账号是否含有指定权限, 返回true或false + * @param permission 权限码 + * @return 是否含有指定权限 + */ + public boolean hasPermission(String permission) { + return hasElement(getPermissionList(), permission); + } + /** * 判断:指定账号id是否含有指定权限, 返回true或false * @param loginId 账号id @@ -1067,19 +1107,9 @@ public class StpLogic { * @return 是否含有指定权限 */ public boolean hasPermission(Object loginId, String permission) { - List permissionList = SaManager.getStpInterface().getPermissionList(loginId, loginType); - return SaStrategy.me.hasElement.apply(permissionList, permission); + return hasElement(getPermissionList(loginId), permission); } - /** - * 判断:当前账号是否含有指定权限, 返回true或false - * @param permission 权限码 - * @return 是否含有指定权限 - */ - public boolean hasPermission(String permission) { - return isLogin() && hasPermission(getLoginId(), permission); - } - /** * 判断:当前账号是否含有指定权限, [指定多个,必须全部具有] * @param permissionArray 权限码数组 @@ -1124,9 +1154,9 @@ public class StpLogic { */ public void checkPermissionAnd(String... permissionArray){ Object loginId = getLoginId(); - List permissionList = SaManager.getStpInterface().getPermissionList(loginId, loginType); + List permissionList = getPermissionList(loginId); for (String permission : permissionArray) { - if(!SaStrategy.me.hasElement.apply(permissionList, permission)) { + if(!hasElement(permissionList, permission)) { throw new NotPermissionException(permission, this.loginType); } } @@ -1138,9 +1168,9 @@ public class StpLogic { */ public void checkPermissionOr(String... permissionArray){ Object loginId = getLoginId(); - List permissionList = SaManager.getStpInterface().getPermissionList(loginId, loginType); + List permissionList = getPermissionList(loginId); for (String permission : permissionArray) { - if(SaStrategy.me.hasElement.apply(permissionList, permission)) { + if(hasElement(permissionList, permission)) { // 有的话提前退出 return; } @@ -1150,14 +1180,6 @@ public class StpLogic { } } - // -- - /** - * 返回当前账号所拥有的权限码集合 - * @return / - */ - public List getPermissionList() { - return SaManager.getStpInterface().getPermissionList(getLoginId(), loginType); - } // ------------------- id 反查 token 相关操作 ------------------- @@ -1574,7 +1596,15 @@ public class StpLogic { return SaManager.getConfig(); } - + /** + * 判断:集合中是否包含指定元素(模糊匹配) + * @param list 集合 + * @param element 元素 + * @return + */ + public boolean hasElement(List list, String element) { + return SaStrategy.me.hasElement.apply(list, element); + } // ------------------- 历史API,兼容旧版本 ------------------- 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 a405e63c..5658f14a 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 @@ -397,8 +397,34 @@ public class StpUtil { // =================== 角色验证操作 =================== + /** + * 获取:当前账号的角色集合 + * @return / + */ + public static List getRoleList() { + return stpLogic.getRoleList(); + } + + /** + * 获取:指定账号的角色集合 + * @param loginId 指定账号id + * @return / + */ + public static List getRoleList(Object loginId) { + return stpLogic.getRoleList(loginId); + } + /** - * 判断:指定账号id是否含有角色标识, 返回true或false + * 判断:当前账号是否拥有指定角色, 返回true或false + * @param role 角色标识 + * @return 是否含有指定角色标识 + */ + public static boolean hasRole(String role) { + return stpLogic.hasRole(role); + } + + /** + * 判断:指定账号是否含有指定角色标识, 返回true或false * @param loginId 账号id * @param role 角色标识 * @return 是否含有指定角色标识 @@ -407,15 +433,6 @@ public class StpUtil { return stpLogic.hasRole(loginId, role); } - /** - * 判断:当前账号是否含有指定角色标识, 返回true或false - * @param role 角色标识 - * @return 是否含有指定角色标识 - */ - public static boolean hasRole(String role) { - return stpLogic.hasRole(role); - } - /** * 判断:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过] * @param roleArray 角色标识数组 @@ -458,26 +475,24 @@ public class StpUtil { stpLogic.checkRoleOr(roleArray); } - // -- - /** - * 返回当前账号所拥有的角色标识集合 - * @return / - */ - public static List getRoleList() { - return stpLogic.getRoleList(); - } - // =================== 权限验证操作 =================== - /** - * 判断:指定账号id是否含有指定权限, 返回true或false - * @param loginId 账号id - * @param permission 权限码 - * @return 是否含有指定权限 - */ - public static boolean hasPermission(Object loginId, String permission) { - return stpLogic.hasPermission(loginId, permission); + /** + * 获取:当前账号的权限码集合 + * @return / + */ + public static List getPermissionList() { + return stpLogic.getPermissionList(); + } + + /** + * 获取:指定账号的权限码集合 + * @param loginId 指定账号id + * @return / + */ + public static List getPermissionList(Object loginId) { + return stpLogic.getPermissionList(loginId); } /** @@ -489,6 +504,16 @@ public class StpUtil { 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 权限码数组 @@ -531,15 +556,6 @@ public class StpUtil { stpLogic.checkPermissionOr(permissionArray); } - // -- - /** - * 返回当前账号所拥有的权限码集合 - * @return / - */ - public static List getPermissionList() { - return stpLogic.getPermissionList(); - } - // =================== id 反查token 相关操作 =================== diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaFoxUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaFoxUtil.java index cd524aea..a6b09310 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaFoxUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaFoxUtil.java @@ -426,4 +426,29 @@ public class SaFoxUtil { return String.join(",", arr); } + /** + * 返回一个空集合 + * @param 集合类型 + * @return 空集合 + */ + public static List emptyList() { + return new ArrayList<>(); + } + + /** + * String数组转集合 + * @param strs String数组 + * @return 集合 + */ + public static List toList(String... strs) { + List list = new ArrayList<>(); + for (String str : strs) { + list.add(str); + } + return list; + } + + + + } diff --git a/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java b/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java index 554081b6..ca017509 100644 --- a/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java +++ b/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java @@ -248,6 +248,7 @@ public class TestController { public AjaxJson test2() { return AjaxJson.getSuccess(); } + } diff --git a/sa-token-plugin/sa-token-temp-jwt/pom.xml b/sa-token-plugin/sa-token-temp-jwt/pom.xml index 11764f34..9def8fa3 100644 --- a/sa-token-plugin/sa-token-temp-jwt/pom.xml +++ b/sa-token-plugin/sa-token-temp-jwt/pom.xml @@ -29,12 +29,12 @@ 0.9.1 - + diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java index 4f33c3a1..950a6a7e 100644 --- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java +++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java @@ -161,7 +161,7 @@ public class SaReactorFilter implements WebFilter { SaReactorSyncHolder.setContext(exchange); // 执行全局过滤器 - SaRouter.match(includeList, excludeList, () -> { + SaRouter.match(includeList).notMatch(excludeList).check(r -> { beforeAuth.run(null); auth.run(null); }); 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 60c6233d..6014aca8 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 @@ -143,11 +143,11 @@ public class SaTokenPathFilter implements Filter { public void doFilter(Context ctx, FilterChain chain) throws Throwable { try { // 执行全局过滤器 - SaRouter.match(includeList, excludeList, () -> { - beforeAuth.run(null); + SaRouter.match(includeList).notMatch(excludeList).check(r -> { + beforeAuth.run(null); auth.run(null); }); - + } catch (StopMatchException e) { } catch (Throwable e) { diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java index 5f7f2101..997920fd 100644 --- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java +++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java @@ -38,7 +38,7 @@ public class SaResponseForSolon implements SaResponse { @Override public SaResponse setStatus(int sc) { - ctx.statusSet(sc); + ctx.status(sc); return this; } diff --git a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/filter/SaServletFilter.java b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/filter/SaServletFilter.java index 46eb59e8..4979859b 100644 --- a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/filter/SaServletFilter.java +++ b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/filter/SaServletFilter.java @@ -155,7 +155,7 @@ public class SaServletFilter implements Filter { try { // 执行全局过滤器 - SaRouter.match(includeList, excludeList, () -> { + SaRouter.match(includeList).notMatch(excludeList).check(r -> { beforeAuth.run(null); auth.run(null); });