From 834e1d5b34e832169172618ac869f66df984a55e Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Sat, 3 Aug 2024 18:50:11 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=B3=A8=E8=A7=A3=E9=89=B4?= =?UTF-8?q?=E6=9D=83=E5=BA=95=E5=B1=82=EF=BC=8C=E5=8F=AF=E4=BB=A5=E6=96=B9?= =?UTF-8?q?=E4=BE=BF=E7=9A=84=E8=87=AA=E5=AE=9A=E4=B9=89=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dev33/satoken/annotation/SaCheckOr.java | 14 +- .../dev33/satoken/basic/SaBasicTemplate.java | 99 -------- .../cn/dev33/satoken/basic/SaBasicUtil.java | 70 ----- ...on.java => NotHttpBasicAuthException.java} | 4 +- .../fun/strategy/SaGetAnnotationFunction.java | 2 +- .../httpauth/basic/SaHttpBasicTemplate.java | 4 +- .../httpauth/digest/SaHttpDigestTemplate.java | 5 + .../httpauth/digest/SaHttpDigestUtil.java | 5 + .../satoken/listener/SaTokenEventCenter.java | 11 + .../satoken/listener/SaTokenListener.java | 7 + .../listener/SaTokenListenerForLog.java | 16 +- .../java/cn/dev33/satoken/stp/StpLogic.java | 153 +++++------ .../cn/dev33/satoken/strategy/SaStrategy.java | 240 ------------------ .../java/com/pj/SaTokenCaseApplication.java | 3 +- .../com/pj/cases/test/TestController.java | 7 +- .../java/com/pj/current/GlobalException.java | 6 +- .../java/com/pj/satoken/SaTokenConfigure.java | 7 +- .../SaUserCheckLogin.java | 10 +- .../SaUserCheckPermission.java | 35 ++- .../SaUserCheckRole.java | 13 +- sa-token-doc/_sidebar.md | 1 + sa-token-doc/up/many-account.md | 7 +- sa-token-doc/use/at-check.md | 12 +- .../cn/dev33/satoken/spring/SaBeanInject.java | 18 +- .../satoken/interceptor/SaInterceptor.java | 15 +- .../integrate/configure/HandlerException.java | 6 +- 26 files changed, 210 insertions(+), 560 deletions(-) delete mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicTemplate.java delete mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicUtil.java rename sa-token-core/src/main/java/cn/dev33/satoken/exception/{NotBasicAuthException.java => NotHttpBasicAuthException.java} (90%) rename sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/{at => custom_annotation}/SaUserCheckLogin.java (71%) rename sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/{at => custom_annotation}/SaUserCheckPermission.java (54%) rename sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/{at => custom_annotation}/SaUserCheckRole.java (72%) diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckOr.java b/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckOr.java index 8652619b..5e2ce739 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckOr.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckOr.java @@ -39,13 +39,6 @@ public @interface SaCheckOr { */ SaCheckLogin[] login() default {}; - /** - * 设定 @SaCheckPermission,参考 {@link SaCheckPermission} - * - * @return / - */ - SaCheckPermission[] permission() default {}; - /** * 设定 @SaCheckRole,参考 {@link SaCheckRole} * @@ -53,6 +46,13 @@ public @interface SaCheckOr { */ SaCheckRole[] role() default {}; + /** + * 设定 @SaCheckPermission,参考 {@link SaCheckPermission} + * + * @return / + */ + SaCheckPermission[] permission() default {}; + /** * 设定 @SaCheckSafe,参考 {@link SaCheckSafe} * diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicTemplate.java b/sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicTemplate.java deleted file mode 100644 index e899154b..00000000 --- a/sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicTemplate.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2020-2099 sa-token.cc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.dev33.satoken.basic; - -import cn.dev33.satoken.SaManager; -import cn.dev33.satoken.context.SaHolder; -import cn.dev33.satoken.error.SaErrorCode; -import cn.dev33.satoken.exception.NotBasicAuthException; -import cn.dev33.satoken.secure.SaBase64Util; -import cn.dev33.satoken.util.SaFoxUtil; - -/** - *
参数 [SaCheckOr 注解的实例] - * - * @param checkOrAnnotation / - * @return / - */ - public SaStrategy setCheckOrAnnotation(SaCheckOrAnnotationFunction checkOrAnnotation) { - this.checkOrAnnotation = checkOrAnnotation; - return this; - } - - /** - * 从元素上获取注解 - * - * @param getAnnotation / - * @return / - */ - public SaStrategy setGetAnnotation(SaGetAnnotationFunction getAnnotation) { - this.getAnnotation = getAnnotation; - return this; - } - - /** - * 判断一个 Method 或其所属 Class 是否包含指定注解 - * - * @param isAnnotationPresent / - * @return / - */ - public SaStrategy setIsAnnotationPresent(SaIsAnnotationPresentFunction isAnnotationPresent) { - this.isAnnotationPresent = isAnnotationPresent; - return this; - } - /** * 生成唯一式 token 的算法 * diff --git a/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/SaTokenCaseApplication.java b/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/SaTokenCaseApplication.java index 025814fc..9f7d5050 100644 --- a/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/SaTokenCaseApplication.java +++ b/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/SaTokenCaseApplication.java @@ -1,10 +1,9 @@ package com.pj; +import cn.dev33.satoken.SaManager; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import cn.dev33.satoken.SaManager; - /** * Sa-Token 示例 * @author click33 diff --git a/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/test/TestController.java b/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/test/TestController.java index 16204f3a..da5aa8eb 100644 --- a/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/test/TestController.java +++ b/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/test/TestController.java @@ -1,10 +1,9 @@ package com.pj.cases.test; +import cn.dev33.satoken.util.SaResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import cn.dev33.satoken.util.SaResult; - /** * 测试专用 Controller * @author click33 @@ -17,14 +16,14 @@ public class TestController { // 测试 浏览器访问: http://localhost:8081/test/test @RequestMapping("test") public SaResult test() { - System.out.println("------------进来了"); + System.out.println("------------进来了"); return SaResult.ok(); } // 测试 浏览器访问: http://localhost:8081/test/test2 @RequestMapping("test2") public SaResult test2() { - System.out.println("------------进来了"); + System.out.println("------------进来了"); return SaResult.ok(); } diff --git a/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/current/GlobalException.java b/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/current/GlobalException.java index fd1f2697..593da152 100644 --- a/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/current/GlobalException.java +++ b/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/current/GlobalException.java @@ -4,7 +4,7 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import cn.dev33.satoken.exception.DisableServiceException; -import cn.dev33.satoken.exception.NotBasicAuthException; +import cn.dev33.satoken.exception.NotHttpBasicAuthException; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.exception.NotPermissionException; import cn.dev33.satoken.exception.NotRoleException; @@ -57,8 +57,8 @@ public class GlobalException { } // 拦截:Http Basic 校验失败异常 - @ExceptionHandler(NotBasicAuthException.class) - public SaResult handlerException(NotBasicAuthException e) { + @ExceptionHandler(NotHttpBasicAuthException.class) + public SaResult handlerException(NotHttpBasicAuthException e) { e.printStackTrace(); return SaResult.error(e.getMessage()); } diff --git a/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/SaTokenConfigure.java b/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/SaTokenConfigure.java index 95940185..643a14b7 100644 --- a/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/SaTokenConfigure.java +++ b/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/SaTokenConfigure.java @@ -5,6 +5,7 @@ import cn.dev33.satoken.filter.SaServletFilter; import cn.dev33.satoken.interceptor.SaInterceptor; import cn.dev33.satoken.router.SaRouter; import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.strategy.SaAnnotationStrategy; import cn.dev33.satoken.strategy.SaStrategy; import cn.dev33.satoken.util.SaResult; import org.springframework.context.annotation.Bean; @@ -117,9 +118,9 @@ public class SaTokenConfigure implements WebMvcConfigurer { @PostConstruct public void rewriteSaStrategy() { // 重写Sa-Token的注解处理器,增加注解合并功能 - SaStrategy.instance.getAnnotation = (element, annotationClass) -> { - return AnnotatedElementUtils.getMergedAnnotation(element, annotationClass); - }; +// SaAnnotationStrategy.instance.getAnnotation = (element, annotationClass) -> { +// return AnnotatedElementUtils.getMergedAnnotation(element, annotationClass); +// }; } } diff --git a/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/at/SaUserCheckLogin.java b/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/custom_annotation/SaUserCheckLogin.java similarity index 71% rename from sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/at/SaUserCheckLogin.java rename to sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/custom_annotation/SaUserCheckLogin.java index 5c623667..9495168b 100644 --- a/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/at/SaUserCheckLogin.java +++ b/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/custom_annotation/SaUserCheckLogin.java @@ -1,20 +1,16 @@ -package com.pj.satoken.at; +package com.pj.satoken.custom_annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import cn.dev33.satoken.annotation.SaCheckLogin; -import com.pj.satoken.StpUserUtil; - /** * 登录认证(User版):只有登录之后才能进入该方法 - *
可标注在函数、类上(效果等同于标注在此类的所有方法上) - * @author click33 + *
可标注在函数、类上(效果等同于标注在此类的所有方法上) * + * @author click33 */ -@SaCheckLogin(type = StpUserUtil.TYPE) @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.METHOD, ElementType.TYPE}) public @interface SaUserCheckLogin { diff --git a/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/at/SaUserCheckPermission.java b/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/custom_annotation/SaUserCheckPermission.java similarity index 54% rename from sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/at/SaUserCheckPermission.java rename to sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/custom_annotation/SaUserCheckPermission.java index 22938622..eb980411 100644 --- a/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/at/SaUserCheckPermission.java +++ b/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/custom_annotation/SaUserCheckPermission.java @@ -1,23 +1,19 @@ -package com.pj.satoken.at; +package com.pj.satoken.custom_annotation; + +import cn.dev33.satoken.annotation.SaMode; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import com.pj.satoken.StpUserUtil; -import org.springframework.core.annotation.AliasFor; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.dev33.satoken.annotation.SaMode; - /** * 权限认证(User版):必须具有指定权限才能进入该方法 - *
可标注在函数、类上(效果等同于标注在此类的所有方法上) + *
可标注在函数、类上(效果等同于标注在此类的所有方法上) + * * @author click33 * */ -@SaCheckPermission(type = StpUserUtil.TYPE) @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.METHOD, ElementType.TYPE}) public @interface SaUserCheckPermission { @@ -26,14 +22,29 @@ public @interface SaUserCheckPermission { * 需要校验的权限码 * @return 需要校验的权限码 */ - @AliasFor(annotation = SaCheckPermission.class) String [] value() default {}; /** * 验证模式:AND | OR,默认AND * @return 验证模式 */ - @AliasFor(annotation = SaCheckPermission.class) SaMode mode() default SaMode.AND; - + + /** + * 在权限校验不通过时的次要选择,两者只要其一校验成功即可通过校验 + * + *
+ * 例1:@SaCheckPermission(value="user-add", orRole="admin"), + * 代表本次请求只要具有 user-add权限 或 admin角色 其一即可通过校验。 + *
+ * + *
+ * 例2: orRole = {"admin", "manager", "staff"},具有三个角色其一即可。
+ * 例3: orRole = {"admin, manager, staff"},必须三个角色同时具备。
+ *
可标注在函数、类上(效果等同于标注在此类的所有方法上)
* @author click33
*
*/
-@SaCheckRole(type = StpUserUtil.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE})
public @interface SaUserCheckRole {
@@ -26,14 +21,12 @@ public @interface SaUserCheckRole {
* 需要校验的角色标识
* @return 需要校验的角色标识
*/
- @AliasFor(annotation = SaCheckRole.class)
String [] value() default {};
/**
* 验证模式:AND | OR,默认AND
* @return 验证模式
*/
- @AliasFor(annotation = SaCheckRole.class)
SaMode mode() default SaMode.AND;
}
diff --git a/sa-token-doc/_sidebar.md b/sa-token-doc/_sidebar.md
index 33726fd6..33e2f4aa 100644
--- a/sa-token-doc/_sidebar.md
+++ b/sa-token-doc/_sidebar.md
@@ -108,6 +108,7 @@
- [TokenInfo参数详解](/fun/token-info)
- [异常细分状态码](/fun/exception-code)
- [数据结构](/fun/data-structure)
+ - [自定义注解](/fun/custom-annotations)
- [参考:把权限放在缓存里](/fun/jur-cache)
- [参考:把路由拦截鉴权动态化](/fun/dynamic-router-check)
- [解决反向代理 uri 丢失的问题](/fun/curr-domain)
diff --git a/sa-token-doc/up/many-account.md b/sa-token-doc/up/many-account.md
index 6879e15f..f3271716 100644
--- a/sa-token-doc/up/many-account.md
+++ b/sa-token-doc/up/many-account.md
@@ -184,8 +184,11 @@ public String info() {
}
```
-注:其它注解 `@SaCheckRole("xxx")`、`@SaCheckPermission("xxx")`同理,
-完整示例参考:[码云:自定义注解](https://gitee.com/dromara/sa-token/tree/dev/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/at)。
+注:其它注解 `@SaCheckRole("xxx")`、`@SaCheckPermission("xxx")`同理, 完整示例参考 Gitee 代码:
+[注解合并](https://gitee.com/dromara/sa-token/tree/master/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/merge_annotation)。
+
+> [!TIP| label:自定义注解方案]
+> 除了注解合并方案,这里还有一份自定义注解方案,参考:[自定义注解](/fun/custom-annotations)
diff --git a/sa-token-doc/use/at-check.md b/sa-token-doc/use/at-check.md
index 0f921043..745e62fd 100644
--- a/sa-token-doc/use/at-check.md
+++ b/sa-token-doc/use/at-check.md
@@ -213,10 +213,16 @@ public SaResult test() {
-### 7、在业务逻辑层使用注解鉴权
-疑问:我能否将注解写在其它架构层呢,比如业务逻辑层?
+### 7、扩展阅读
-使用拦截器模式,只能在`Controller层`进行注解鉴权,如需在任意层级使用注解鉴权,请参考:[AOP注解鉴权](/plugin/aop-at)
+- 在业务逻辑层使用鉴权注解:[AOP注解鉴权](/plugin/aop-at)
+
+- 制作自定义鉴权注解注入到框架:[自定义注解](/fun/custom-annotations)
+
+
+
---
diff --git a/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java b/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java
index 308d6b25..69d4777e 100644
--- a/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java
+++ b/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java
@@ -16,6 +16,7 @@
package cn.dev33.satoken.spring;
import cn.dev33.satoken.SaManager;
+import cn.dev33.satoken.annotation.handler.SaAnnotationAbstractHandler;
import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.context.SaTokenContext;
import cn.dev33.satoken.context.second.SaTokenSecondContextCreator;
@@ -34,6 +35,7 @@ import cn.dev33.satoken.spring.pathmatch.SaPathMatcherHolder;
import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
+import cn.dev33.satoken.strategy.SaAnnotationStrategy;
import cn.dev33.satoken.temp.SaTempInterface;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -118,6 +120,18 @@ public class SaBeanInject {
SaTokenEventCenter.registerListenerList(listenerList);
}
+ /**
+ * 注入自定义注解处理器
+ *
+ * @param handlerList 自定义注解处理器集合
+ */
+ @Autowired(required = false)
+ public void setSaAnnotationHandler(List