diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckLogin.java b/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckLogin.java index a7a644db..f2d85fac 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckLogin.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckLogin.java @@ -15,4 +15,13 @@ import java.lang.annotation.Target; @Target({ ElementType.METHOD, ElementType.TYPE }) public @interface SaCheckLogin { + /** + * 多账号下哪些需要校验 + * 每个StpUtil都有一个stpLogic属性 + * 初始化StpLogic时,指定的LoginKey字符串放入这里 + * 可以放多个,所以类型为数组 + * @return LoginKey字符串数组 + */ + String [] loginKeys() default {}; + } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotPermissionException.java b/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotPermissionException.java index 9b9e2c76..9cd0c245 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotPermissionException.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotPermissionException.java @@ -1,7 +1,5 @@ package cn.dev33.satoken.exception; -import cn.dev33.satoken.stp.StpUtil; - /** * 没有指定权限码,抛出的异常 * @@ -13,7 +11,7 @@ public class NotPermissionException extends SaTokenException { /** * 序列化版本号 */ - private static final long serialVersionUID = 6806129545290130142L; + private static final long serialVersionUID = 6806129545290130141L; /** 权限码 */ private String code; @@ -39,10 +37,6 @@ public class NotPermissionException extends SaTokenException { return loginKey; } - public NotPermissionException(String code) { - this(code, StpUtil.stpLogic.loginKey); - } - public NotPermissionException(String code, String loginKey) { super("无此权限:" + code); this.code = code; diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotRoleException.java b/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotRoleException.java index fe87c33c..fd171e44 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotRoleException.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotRoleException.java @@ -1,7 +1,5 @@ package cn.dev33.satoken.exception; -import cn.dev33.satoken.stp.StpUtil; - /** * 没有指定角色标识,抛出的异常 * @@ -39,10 +37,6 @@ public class NotRoleException extends SaTokenException { return loginKey; } - public NotRoleException(String role) { - this(role, StpUtil.stpLogic.loginKey); - } - public NotRoleException(String role, String loginKey) { // 这里到底要不要拼接上loginKey呢?纠结 super("无此角色:" + role); diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/exception/UnrecognizedLoginKeyException.java b/sa-token-core/src/main/java/cn/dev33/satoken/exception/UnrecognizedLoginKeyException.java new file mode 100644 index 00000000..a4b5b117 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/exception/UnrecognizedLoginKeyException.java @@ -0,0 +1,29 @@ +package cn.dev33.satoken.exception; + +public class UnrecognizedLoginKeyException extends RuntimeException{ + + /** + * 序列化版本号 + */ + private static final long serialVersionUID = 6806129545290130140L; + + /** + * loginKey + */ + private String loginKey; + + /** + * 获得loginKey + * + * @return loginKey + */ + public String getLoginKey() { + return loginKey; + } + + public UnrecognizedLoginKeyException(String loginKey) { + super("未知的loginKey: " + loginKey); + this.loginKey = loginKey; + } + +} diff --git a/sa-token-spring-aop/src/main/java/cn/dev33/satoken/aop/SaCheckAspect.java b/sa-token-spring-aop/src/main/java/cn/dev33/satoken/aop/SaCheckAspect.java index a57194f6..baaf0fef 100644 --- a/sa-token-spring-aop/src/main/java/cn/dev33/satoken/aop/SaCheckAspect.java +++ b/sa-token-spring-aop/src/main/java/cn/dev33/satoken/aop/SaCheckAspect.java @@ -1,5 +1,7 @@ package cn.dev33.satoken.aop; +import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.annotation.SaCheckLogin; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @@ -12,6 +14,8 @@ import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.util.SaTokenConsts; +import java.lang.reflect.Method; + /** * sa-token 基于 Spring Aop 的注解鉴权 * @@ -58,8 +62,31 @@ public class SaCheckAspect { */ @Around("pointcut()") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { + + + // 注解鉴权 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + // ----------- 验证登录 + if(method.isAnnotationPresent(SaCheckLogin.class) || method.getDeclaringClass().isAnnotationPresent(SaCheckLogin.class)) { + SaCheckLogin checkLogin = method.getAnnotation(SaCheckLogin.class); + if(checkLogin.loginKeys().length == 0) { + getStpLogic().checkLogin(); + } else { + for(String loginKey : checkLogin.loginKeys()) { + if (SaManager.stpLogicMap.containsKey(loginKey)) { + StpLogic stpLogic = SaManager.stpLogicMap.get(loginKey); + stpLogic.checkLogin(); + } else { + + } + + } + } + } + + getStpLogic().checkMethodAnnotation(signature.getMethod()); try { // 执行原有逻辑