From 43308bf5937ca2c039c5209823d4bd69dea6c19a Mon Sep 17 00:00:00 2001 From: shengzhang <2393584716@qq.com> Date: Mon, 28 Dec 2020 01:14:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9D=83=E9=99=90=E7=A0=81=E9=99=90=E5=AE=9A?= =?UTF-8?q?=E5=BF=85=E9=A1=BB=E4=B8=BAString=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/dev33/satoken/stp/StpInterface.java | 2 +- .../satoken/stp/StpInterfaceDefaultImpl.java | 4 +- .../java/cn/dev33/satoken/stp/StpLogic.java | 26 +-- .../java/cn/dev33/satoken/stp/StpUtil.java | 12 +- .../java/com/pj/satoken/StpInterfaceImpl.java | 4 +- .../main/java/com/pj/satoken/StpUserUtil.java | 207 ++++++++++++------ .../main/java/com/pj/test/TestController.java | 2 +- .../interceptor/SaCheckInterceptor.java | 58 ++--- 8 files changed, 184 insertions(+), 131 deletions(-) diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterface.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterface.java index 0b3b7cfc..f05ed0e5 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterface.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterface.java @@ -14,7 +14,7 @@ public interface StpInterface { * @param loginKey 具体的stp标识 * @return 该账号id具有的权限码集合 */ - public List getPermissionCodeList(Object loginId, String loginKey); + public List getPermissionCodeList(Object loginId, String loginKey); } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterfaceDefaultImpl.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterfaceDefaultImpl.java index 39026014..bcfb4abe 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterfaceDefaultImpl.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterfaceDefaultImpl.java @@ -10,8 +10,8 @@ import java.util.List; public class StpInterfaceDefaultImpl implements StpInterface { @Override - public List getPermissionCodeList(Object loginId, String loginKey) { - return new ArrayList(); + public List getPermissionCodeList(Object loginId, String loginKey) { + return new ArrayList(); } } 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 3f6b3e1f..a3312303 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 @@ -678,9 +678,9 @@ public class StpLogic { * @param permissionCode 权限码 * @return 是否含有指定权限 */ - public boolean hasPermission(Object loginId, Object permissionCode) { - List pcodeList = SaTokenManager.getStpInterface().getPermissionCodeList(loginId, loginKey); - return !(pcodeList == null || pcodeList.contains(permissionCode) == false); + public boolean hasPermission(Object loginId, String permissionCode) { + List permissionCodeList = SaTokenManager.getStpInterface().getPermissionCodeList(loginId, loginKey); + return !(permissionCodeList == null || permissionCodeList.contains(permissionCode) == false); } /** @@ -688,7 +688,7 @@ public class StpLogic { * @param permissionCode 权限码 * @return 是否含有指定权限 */ - public boolean hasPermission(Object permissionCode) { + public boolean hasPermission(String permissionCode) { return hasPermission(getLoginId(), permissionCode); } @@ -696,7 +696,7 @@ public class StpLogic { * 当前账号是否含有指定权限, 没有就抛出异常 * @param permissionCode 权限码 */ - public void checkPermission(Object permissionCode) { + public void checkPermission(String permissionCode) { if(hasPermission(permissionCode) == false) { throw new NotPermissionException(permissionCode, this.loginKey); } @@ -706,11 +706,11 @@ public class StpLogic { * 当前账号是否含有指定权限, [指定多个,必须全都有] * @param permissionCodeArray 权限码数组 */ - public void checkPermissionAnd(Object... permissionCodeArray){ + public void checkPermissionAnd(String... permissionCodeArray){ Object loginId = getLoginId(); - List pcodeList = SaTokenManager.getStpInterface().getPermissionCodeList(loginId, loginKey); - for (Object pcode : permissionCodeArray) { - if(pcodeList.contains(pcode) == false) { + List permissionCodeList = SaTokenManager.getStpInterface().getPermissionCodeList(loginId, loginKey); + for (String pcode : permissionCodeArray) { + if(permissionCodeList.contains(pcode) == false) { throw new NotPermissionException(pcode, this.loginKey); // 没有权限抛出异常 } } @@ -720,11 +720,11 @@ public class StpLogic { * 当前账号是否含有指定权限, [指定多个,有一个就可以通过] * @param permissionCodeArray 权限码数组 */ - public void checkPermissionOr(Object... permissionCodeArray){ + public void checkPermissionOr(String... permissionCodeArray){ Object loginId = getLoginId(); - List pcodeList = SaTokenManager.getStpInterface().getPermissionCodeList(loginId, loginKey); - for (Object pcode : permissionCodeArray) { - if(pcodeList.contains(pcode) == true) { + List permissionCodeList = SaTokenManager.getStpInterface().getPermissionCodeList(loginId, loginKey); + for (String permissionCode : permissionCodeArray) { + if(permissionCodeList.contains(permissionCode) == true) { return; // 有的话提前退出 } } 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 802a2e04..7df64584 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 @@ -311,8 +311,8 @@ public class StpUtil { * @param permissionCode 权限码 * @return 是否含有指定权限 */ - public static boolean hasPermission(Object loginId, Object pcode) { - return stpLogic.hasPermission(loginId, pcode); + public static boolean hasPermission(Object loginId, String permissionCode) { + return stpLogic.hasPermission(loginId, permissionCode); } /** @@ -320,7 +320,7 @@ public class StpUtil { * @param permissionCode 权限码 * @return 是否含有指定权限 */ - public static boolean hasPermission(Object permissionCode) { + public static boolean hasPermission(String permissionCode) { return stpLogic.hasPermission(permissionCode); } @@ -328,7 +328,7 @@ public class StpUtil { * 当前账号是否含有指定权限, 没有就抛出异常 * @param permissionCode 权限码 */ - public static void checkPermission(Object permissionCode) { + public static void checkPermission(String permissionCode) { stpLogic.checkPermission(permissionCode); } @@ -336,7 +336,7 @@ public class StpUtil { * 当前账号是否含有指定权限, [指定多个,必须全都有] * @param permissionCodeArray 权限码数组 */ - public static void checkPermissionAnd(Object... permissionCodeArray) { + public static void checkPermissionAnd(String... permissionCodeArray) { stpLogic.checkPermissionAnd(permissionCodeArray); } @@ -344,7 +344,7 @@ public class StpUtil { * 当前账号是否含有指定权限, [指定多个,有一个就可以通过] * @param permissionCodeArray 权限码数组 */ - public static void checkPermissionOr(Object... permissionCodeArray) { + public static void checkPermissionOr(String... permissionCodeArray) { stpLogic.checkPermissionOr(permissionCodeArray); } diff --git a/sa-token-demo-springboot/src/main/java/com/pj/satoken/StpInterfaceImpl.java b/sa-token-demo-springboot/src/main/java/com/pj/satoken/StpInterfaceImpl.java index e703beb6..afb5165c 100644 --- a/sa-token-demo-springboot/src/main/java/com/pj/satoken/StpInterfaceImpl.java +++ b/sa-token-demo-springboot/src/main/java/com/pj/satoken/StpInterfaceImpl.java @@ -15,8 +15,8 @@ public class StpInterfaceImpl implements StpInterface { // 返回一个账号所拥有的权限码集合 @Override - public List getPermissionCodeList(Object login_id, String login_key) { - List list = new ArrayList(); // 本list仅做模拟,实际项目中要根据具体业务逻辑来查询权限 + public List getPermissionCodeList(Object login_id, String login_key) { + List list = new ArrayList(); // 本list仅做模拟,实际项目中要根据具体业务逻辑来查询权限 list.add("101"); list.add("user-add"); list.add("user-delete"); diff --git a/sa-token-demo-springboot/src/main/java/com/pj/satoken/StpUserUtil.java b/sa-token-demo-springboot/src/main/java/com/pj/satoken/StpUserUtil.java index 6400b0d2..4311089c 100644 --- a/sa-token-demo-springboot/src/main/java/com/pj/satoken/StpUserUtil.java +++ b/sa-token-demo-springboot/src/main/java/com/pj/satoken/StpUserUtil.java @@ -5,7 +5,7 @@ import cn.dev33.satoken.stp.SaTokenInfo; import cn.dev33.satoken.stp.StpLogic; /** - * 一个默认的实现 + * user认证实现 * @author kong */ public class StpUserUtil { @@ -35,22 +35,22 @@ public class StpUserUtil { } /** - * 获取指定id的tokenValue - * @param loginId . - * @return + * 获取指定loginId的tokenValue + * @param loginId 账号id + * @return token值 */ public static String getTokenValueByLoginId(Object loginId) { return stpLogic.getTokenValueByLoginId(loginId); } - + /** - * 获取当前StpLogin的loginKey + * 获取当前StpLogin的loginKey * @return 当前StpLogin的loginKey */ public static String getLoginKey(){ return stpLogic.getLoginKey(); } - + /** * 获取当前会话的token信息 * @return token信息 @@ -59,11 +59,12 @@ public class StpUserUtil { return stpLogic.getTokenInfo(); } + // =================== 登录相关操作 =================== /** * 在当前会话上登录id - * @param loginId 登录id ,建议的类型:(long | int | String) + * @param loginId 登录id,建议的类型:(long | int | String) */ public static void setLoginId(Object loginId) { stpLogic.setLoginId(loginId); @@ -77,7 +78,7 @@ public class StpUserUtil { } /** - * 指定loginId的会话注销登录(清退下线) + * 指定loginId的会话注销登录(正常注销下线) * @param loginId 账号id */ public static void logoutByLoginId(Object loginId) { @@ -94,41 +95,42 @@ public class StpUserUtil { // 查询相关 - /** - * 获取当前会话是否已经登录 + /** + * 获取当前会话是否已经登录 * @return 是否已登录 */ public static boolean isLogin() { return stpLogic.isLogin(); } - /** - * 检验当前会话是否已经登录,如未登录,则抛出异常 + /** + * 检验当前会话是否已经登录,如未登录,则抛出异常 */ public static void checkLogin() { - getLoginId(); + stpLogic.checkLogin(); } - - /** - * 获取当前会话登录id, 如果未登录,则抛出异常 - * @return . + + /** + * 获取当前会话账号id, 如果未登录,则抛出异常 + * @return 账号id */ public static Object getLoginId() { return stpLogic.getLoginId(); } /** - * 获取当前会话登录id, 如果未登录,则返回默认值 - * @param defaultValue . - * @return . + * 获取当前会话登录id, 如果未登录,则返回默认值 + * @param 返回类型 + * @param defaultValue 默认值 + * @return 登录id */ public static T getLoginId(T defaultValue) { return stpLogic.getLoginId(defaultValue); } - + /** - * 获取当前会话登录id, 如果未登录,则返回null - * @return + * 获取当前会话登录id, 如果未登录,则返回null + * @return 账号id */ public static Object getLoginIdDefaultNull() { return stpLogic.getLoginIdDefaultNull(); @@ -136,7 +138,7 @@ public class StpUserUtil { /** * 获取当前会话登录id, 并转换为String - * @return + * @return 账号id */ public static String getLoginIdAsString() { return stpLogic.getLoginIdAsString(); @@ -144,7 +146,7 @@ public class StpUserUtil { /** * 获取当前会话登录id, 并转换为int - * @return + * @return 账号id */ public static int getLoginIdAsInt() { return stpLogic.getLoginIdAsInt(); @@ -152,15 +154,16 @@ public class StpUserUtil { /** * 获取当前会话登录id, 并转换为long - * @return + * @return 账号id */ public static long getLoginIdAsLong() { return stpLogic.getLoginIdAsLong(); } - /** + /** * 获取指定token对应的登录id,如果未登录,则返回 null - * @return . + * @param tokenValue token + * @return 登录id */ public static Object getLoginIdByToken(String tokenValue) { return stpLogic.getLoginIdByToken(tokenValue); @@ -170,8 +173,8 @@ public class StpUserUtil { // =================== session相关 =================== /** - * 获取指定loginId的session, 如果没有,isCreate=是否新建并返回 - * @param loginId 登录id + * 获取指定loginId的session, 如果session尚未创建,isCreate=是否新建并返回 + * @param loginId 账号id * @param isCreate 是否新建 * @return SaSession */ @@ -180,31 +183,80 @@ public class StpUserUtil { } /** - * 获取指定loginId的session - * @param loginId . - * @return . + * 获取指定loginId的session, 如果session尚未创建,isCreate=是否新建并返回 + * @param loginId 账号id + * @param isCreate 是否新建 + * @return SaSession */ public static SaSession getSessionByLoginId(Object loginId) { return stpLogic.getSessionByLoginId(loginId); } - + /** - * 获取当前会话的session - * @return + * 获取当前会话的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 是否已经[临时过期],如果已经过期则抛出异常 + */ + public static void checkActivityTimeout() { + stpLogic.checkActivityTimeout(); + } + + /** + * 续签当前token:(将 [最后操作时间] 更新为当前时间戳) + *

请注意: 即时token已经 [临时过期] 也可续签成功, + * 如果此场景下需要提示续签失败,可在此之前调用 checkActivityTimeout() 强制检查是否过期即可

+ */ + public static void updateLastActivityToNow() { + stpLogic.updateLastActivityToNow(); + } + + // =================== 过期时间相关 =================== /** * 获取当前登录者的token剩余有效时间 (单位: 秒) * @return token剩余有效时间 */ - public long getTimeout() { + public static long getTimeout() { return stpLogic.getTokenTimeout(); } @@ -213,7 +265,7 @@ public class StpUserUtil { * @param loginId 指定loginId * @return token剩余有效时间 */ - public long getTimeoutByLoginId(Object loginId) { + public static long getTimeoutByLoginId(Object loginId) { return stpLogic.getTokenTimeoutByLoginId(loginId); } @@ -221,7 +273,7 @@ public class StpUserUtil { * 获取当前登录者的Session剩余有效时间 (单位: 秒) * @return token剩余有效时间 */ - public long getSessionTimeout() { + public static long getSessionTimeout() { return stpLogic.getSessionTimeout(); } @@ -230,55 +282,72 @@ public class StpUserUtil { * @param loginId 指定loginId * @return token剩余有效时间 */ - public long getSessionTimeoutByLoginId(Object loginId) { + public static long getSessionTimeoutByLoginId(Object loginId) { return stpLogic.getSessionTimeoutByLoginId(loginId); } + /** + * 获取当前token[临时过期]剩余有效时间 (单位: 秒) + * @return token[临时过期]剩余有效时间 + */ + public static long getTokenActivityTimeout() { + return stpLogic.getTokenActivityTimeout(); + } + + /** + * 获取指定token[临时过期]剩余有效时间 (单位: 秒) + * @param tokenValue 指定token + * @return token[临时过期]剩余有效时间 + */ + public static long getTokenActivityTimeoutByToken(String tokenValue) { + return stpLogic.getTokenActivityTimeoutByToken(tokenValue); + } + // =================== 权限验证操作 =================== - /** - * 指定loginId是否含有指定权限 - * @param loginId . - * @param pcode . - * @return . + /** + * 指定账号id是否含有指定权限 + * @param loginId 账号id + * @param permissionCode 权限码 + * @return 是否含有指定权限 */ - public static boolean hasPermission(Object loginId, Object pcode) { - return stpLogic.hasPermission(loginId, pcode); + public static boolean hasPermission(Object loginId, String permissionCode) { + return stpLogic.hasPermission(loginId, permissionCode); } - /** - * 当前会话是否含有指定权限 - * @param pcode . - * @return . + /** + * 当前账号id是否含有指定权限 + * @param permissionCode 权限码 + * @return 是否含有指定权限 */ - public static boolean hasPermission(Object pcode) { - return stpLogic.hasPermission(pcode); + public static boolean hasPermission(String permissionCode) { + return stpLogic.hasPermission(permissionCode); } - /** - * 当前账号是否含有指定权限 , 没有就抛出异常 - * @param pcode . + /** + * 当前账号是否含有指定权限, 没有就抛出异常 + * @param permissionCode 权限码 */ - public static void checkPermission(Object pcode) { - stpLogic.checkPermission(pcode); + public static void checkPermission(String permissionCode) { + stpLogic.checkPermission(permissionCode); } - /** - * 当前账号是否含有指定权限 , 【指定多个,必须全都有】 - * @param pcodeArray . + /** + * 当前账号是否含有指定权限, [指定多个,必须全都有] + * @param permissionCodeArray 权限码数组 */ - public static void checkPermissionAnd(Object... pcodeArray) { - stpLogic.checkPermissionAnd(pcodeArray); + public static void checkPermissionAnd(String... permissionCodeArray) { + stpLogic.checkPermissionAnd(permissionCodeArray); } - /** - * 当前账号是否含有指定权限 , 【指定多个,有一个就可以了】 - * @param pcodeArray . + /** + * 当前账号是否含有指定权限, [指定多个,有一个就可以通过] + * @param permissionCodeArray 权限码数组 */ - public static void checkPermissionOr(Object... pcodeArray) { - stpLogic.checkPermissionOr(pcodeArray); + public static void checkPermissionOr(String... permissionCodeArray) { + stpLogic.checkPermissionOr(permissionCodeArray); } diff --git a/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java b/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java index db26d000..b509772d 100644 --- a/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java +++ b/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java @@ -51,7 +51,7 @@ public class TestController { public AjaxJson jur() { System.out.println("======================= 进入方法,测试权限接口 ========================= "); - System.out.println("是否具有权限101" + StpUtil.hasPermission(101)); + System.out.println("是否具有权限101" + StpUtil.hasPermission("101")); System.out.println("是否具有权限user-add" + StpUtil.hasPermission("user-add")); System.out.println("是否具有权限article-get" + StpUtil.hasPermission("article-get")); diff --git a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaCheckInterceptor.java b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaCheckInterceptor.java index b20d19d3..a399e411 100644 --- a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaCheckInterceptor.java +++ b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaCheckInterceptor.java @@ -24,7 +24,7 @@ public class SaCheckInterceptor implements HandlerInterceptor { public StpLogic stpLogic = null; /** - * 创建,并指定一个默认的 StpLogic + * 创建,并指定一个默认的 StpLogic */ public SaCheckInterceptor() { this(StpUtil.stpLogic); @@ -52,52 +52,36 @@ public class SaCheckInterceptor implements HandlerInterceptor { } HandlerMethod method = (HandlerMethod ) handler; - // 验证登录 + // ----------- 验证登录 if(method.hasMethodAnnotation(SaCheckLogin.class) || method.getBeanType().isAnnotationPresent(SaCheckLogin.class)) { stpLogic.checkLogin(); } - // 获取权限注解 + // ----------- 验证权限 + // 验证方法上的 SaCheckPermission scp = method.getMethodAnnotation(SaCheckPermission.class); - if(scp == null) { - scp = method.getBeanType().getAnnotation(SaCheckPermission.class); + if(scp != null) { + String[] permissionCodeArray = scp.value(); + if(scp.isAnd()) { + stpLogic.checkPermissionAnd(permissionCodeArray); // 必须全部都有 + } else { + stpLogic.checkPermissionOr(permissionCodeArray); // 有一个就行了 + } } - if(scp == null) { - return true; + // 验证类上的 + scp = method.getBeanType().getAnnotation(SaCheckPermission.class); + if(scp != null) { + String[] permissionCodeArray = scp.value(); + if(scp.isAnd()) { + stpLogic.checkPermissionAnd(permissionCodeArray); // 必须全部都有 + } else { + stpLogic.checkPermissionOr(permissionCodeArray); // 有一个就行了 + } } - // 开始验证权限 - Object[] codeArray = concatAbc(scp.value(), scp.valueInt(), scp.valueLong()); - if(scp.isAnd()) { - stpLogic.checkPermissionAnd(codeArray); // 必须全部都有 - } else { - stpLogic.checkPermissionOr(codeArray); // 有一个就行了 - } - + // 通过验证 return true; } - - /** - * 合并三个数组 - * @param a . - * @param b . - * @param c . - * @return . - */ - private Object[] concatAbc(String[] a, int[] b, long[] c) { - // 循环赋值 - Object[] d = new Object[a.length + b.length + c.length]; - for (int i = 0; i < a.length; i++) { - d[i] = a[i]; - } - for (int i = 0; i < b.length; i++) { - d[a.length + i] = b[i]; - } - for (int i = 0; i < c.length; i++) { - d[a.length + b.length + i] = c[i]; - } - return d; - }