From 89b1a2a3534fe50577da8e4e40a3ee4f8f9b3634 Mon Sep 17 00:00:00 2001 From: shengzhang <2393584716@qq.com> Date: Mon, 5 Apr 2021 01:14:13 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E5=B0=81=E7=A6=81=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/DisableLoginException.java | 78 +++++++++++++++++++ .../java/cn/dev33/satoken/stp/StpLogic.java | 46 ++++++++++- .../java/cn/dev33/satoken/stp/StpUtil.java | 28 +++++++ sa-token-demo-springboot/pom.xml | 8 +- .../java/com/pj/test/GlobalException.java | 4 + .../main/java/com/pj/test/TestController.java | 5 -- sa-token-doc/index.css | 2 +- sa-token-doc/index.html | 6 ++ 8 files changed, 166 insertions(+), 11 deletions(-) create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/exception/DisableLoginException.java diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/exception/DisableLoginException.java b/sa-token-core/src/main/java/cn/dev33/satoken/exception/DisableLoginException.java new file mode 100644 index 00000000..bee0c55f --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/exception/DisableLoginException.java @@ -0,0 +1,78 @@ +package cn.dev33.satoken.exception; + +/** + * 一个异常:代表账号已被封禁 + * + * @author kong + */ +public class DisableLoginException extends SaTokenException { + + /** + * 序列化版本号 + */ + private static final long serialVersionUID = 6806129545290130143L; + + /** 异常标记值 */ + public static final String BE_VALUE = "disable"; + + /** 异常提示语 */ + public static final String BE_MESSAGE = "此账号已被封禁"; + + /** + * LoginKey + */ + private String loginKey; + + /** + * 被封禁的账号id + */ + private Object loginId; + + /** + * 封禁剩余时间,单位:秒 + */ + private long disableTime; + + /** + * 获得LoginKey + * + * @return See above + */ + public String getLoginKey() { + return loginKey; + } + + /** + * 获取: 被封禁的账号id + * + * @return See above + */ + public Object getLoginId() { + return loginId; + } + + /** + * 获取: 封禁剩余时间,单位:秒 + * @return See above + */ + public long getDisableTime() { + return disableTime; + } + + /** + * 构造方法创建一个 + * + * @param loginKey loginKey + * @param loginId 被封禁的账号id + * @param disableTime 封禁剩余时间,单位:秒 + */ + public DisableLoginException(String loginKey, Object loginId, long disableTime) { + super(BE_MESSAGE); + this.loginId = loginId; + this.loginKey = loginKey; + this.disableTime = disableTime; + } + + + +} 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 14718e5a..326ea754 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 @@ -17,6 +17,7 @@ import cn.dev33.satoken.annotation.SaCheckRole; import cn.dev33.satoken.annotation.SaMode; import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.dao.SaTokenDao; +import cn.dev33.satoken.exception.DisableLoginException; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.exception.NotPermissionException; import cn.dev33.satoken.exception.NotRoleException; @@ -181,6 +182,8 @@ public class StpLogic { // =================== 登录相关操作 =================== + // 登录与注销 + /** * 在当前会话上登录id * @param loginId 登录id,建议的类型:(long | int | String) @@ -214,6 +217,11 @@ public class StpLogic { */ public void setLoginId(Object loginId, SaLoginModel loginModel) { + // ------ 0、检查此账号是否已被封禁 + if(isDisable(loginId)) { + throw new DisableLoginException(loginKey, loginId, getDisableTime(loginId)); + } + // ------ 1、获取相应对象 SaTokenConfig config = getConfig(); SaTokenDao dao = SaTokenManager.getSaTokenDao(); @@ -353,6 +361,34 @@ public class StpLogic { session.logoutByTokenSignCountToZero(); } + /** + * 封禁指定账号 + *
此方法不会直接将此账号id踢下线,而是在对方再次登录时抛出`DisableLoginException`异常 + * @param loginId 指定账号id + * @param disableTime 封禁时间, 单位: 秒 (-1=永久封禁) + */ + public void disableLoginId(Object loginId, long disableTime) { + SaTokenManager.getSaTokenDao().set(splicingKeyDisable(loginId), DisableLoginException.BE_VALUE, disableTime); + } + + /** + * 指定账号是否已被封禁 (true=已被封禁, false=未被封禁) + * @param loginId 账号id + * @return see note + */ + public boolean isDisable(Object loginId) { + return SaTokenManager.getSaTokenDao().get(splicingKeyDisable(loginId)) != null; + } + + /** + * 获取指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁) + * @param loginId 账号id + * @return see note + */ + public long getDisableTime(Object loginId) { + return SaTokenManager.getSaTokenDao().getTimeout(splicingKeyDisable(loginId)); + } + // 查询相关 /** @@ -1129,7 +1165,15 @@ public class StpLogic { public String splicingKeyJustCreatedSave() { return SaTokenConsts.JUST_CREATED_SAVE_KEY + loginKey; } - + + /** + * 拼接key: 账号封禁 + * @param loginId 账号id + * @return key + */ + public String splicingKeyDisable(Object loginId) { + return getConfig().getTokenName() + ":" + loginKey + ":disable:" + loginId; + } // =================== Bean对象代理 =================== 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 e74cdd22..ed7a0a4a 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 @@ -132,7 +132,35 @@ public class StpUtil { public static void logoutByLoginId(Object loginId, String device) { stpLogic.logoutByLoginId(loginId, device); } + + /** + * 封禁指定账号 + *
此方法不会直接将此账号id踢下线,而是在对方再次登录时抛出`DisableLoginException`异常 + * @param loginId 指定账号id + * @param disableTime 封禁时间, 单位: 秒 (-1=永久封禁) + */ + public static void disableLoginId(Object loginId, long disableTime) { + stpLogic.disableLoginId(loginId, disableTime); + } + /** + * 指定账号是否已被封禁 (true=已被封禁, false=未被封禁) + * @param loginId 账号id + * @return see note + */ + public static boolean isDisable(Object loginId) { + return stpLogic.isDisable(loginId); + } + + /** + * 获取指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁) + * @param loginId 账号id + * @return see note + */ + public static long getDisableTime(Object loginId) { + return stpLogic.getDisableTime(loginId); + } + // 查询相关 diff --git a/sa-token-demo-springboot/pom.xml b/sa-token-demo-springboot/pom.xml index a89facbc..cb735a4d 100644 --- a/sa-token-demo-springboot/pom.xml +++ b/sa-token-demo-springboot/pom.xml @@ -46,17 +46,17 @@ --> - + - +