mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-10-31 00:57:13 +08:00 
			
		
		
		
	fix: 临时修复使用 @CrudRequestMapping 注解的接口无法通过 @SaIgnore 放行的问题
https://gitee.com/dromara/sa-token/issues/I8RIBL
This commit is contained in:
		| @@ -17,6 +17,7 @@ | |||||||
| package top.continew.admin.config.satoken; | package top.continew.admin.config.satoken; | ||||||
|  |  | ||||||
| import cn.dev33.satoken.SaManager; | import cn.dev33.satoken.SaManager; | ||||||
|  | import cn.dev33.satoken.annotation.SaIgnore; | ||||||
| import cn.dev33.satoken.context.SaHolder; | import cn.dev33.satoken.context.SaHolder; | ||||||
| import cn.dev33.satoken.context.model.SaRequest; | import cn.dev33.satoken.context.model.SaRequest; | ||||||
| import cn.dev33.satoken.interceptor.SaInterceptor; | import cn.dev33.satoken.interceptor.SaInterceptor; | ||||||
| @@ -26,8 +27,14 @@ import cn.dev33.satoken.sign.SaSignUtil; | |||||||
| import cn.dev33.satoken.stp.StpInterface; | import cn.dev33.satoken.stp.StpInterface; | ||||||
| import cn.dev33.satoken.stp.StpUtil; | import cn.dev33.satoken.stp.StpUtil; | ||||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||||
|  | import org.springframework.aop.framework.AopProxyUtils; | ||||||
|  | import org.springframework.aop.support.AopUtils; | ||||||
|  | import org.springframework.boot.context.event.ApplicationReadyEvent; | ||||||
|  | import org.springframework.context.ApplicationContext; | ||||||
| import org.springframework.context.annotation.Bean; | import org.springframework.context.annotation.Bean; | ||||||
| import org.springframework.context.annotation.Configuration; | import org.springframework.context.annotation.Configuration; | ||||||
|  | import org.springframework.context.event.EventListener; | ||||||
|  | import org.springframework.core.annotation.AnnotationUtils; | ||||||
| import top.continew.admin.common.context.UserContext; | import top.continew.admin.common.context.UserContext; | ||||||
| import top.continew.admin.common.context.UserContextHolder; | import top.continew.admin.common.context.UserContextHolder; | ||||||
| import top.continew.admin.open.sign.OpenApiSignTemplate; | import top.continew.admin.open.sign.OpenApiSignTemplate; | ||||||
| @@ -35,8 +42,9 @@ import top.continew.starter.auth.satoken.autoconfigure.SaTokenExtensionPropertie | |||||||
| import top.continew.starter.core.constant.StringConstants; | import top.continew.starter.core.constant.StringConstants; | ||||||
| import top.continew.starter.core.exception.BusinessException; | import top.continew.starter.core.exception.BusinessException; | ||||||
| import top.continew.starter.core.validation.CheckUtils; | import top.continew.starter.core.validation.CheckUtils; | ||||||
|  | import top.continew.starter.extension.crud.annotation.CrudRequestMapping; | ||||||
|  |  | ||||||
| import java.util.Collection; | import java.util.*; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Sa-Token 配置 |  * Sa-Token 配置 | ||||||
| @@ -52,6 +60,7 @@ public class SaTokenConfiguration { | |||||||
|     private final SaTokenExtensionProperties properties; |     private final SaTokenExtensionProperties properties; | ||||||
|     private final LoginPasswordProperties loginPasswordProperties; |     private final LoginPasswordProperties loginPasswordProperties; | ||||||
|     private final OpenApiSignTemplate signTemplate; |     private final OpenApiSignTemplate signTemplate; | ||||||
|  |     private final ApplicationContext applicationContext; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Sa-Token 权限认证配置 |      * Sa-Token 权限认证配置 | ||||||
| @@ -90,4 +99,34 @@ public class SaTokenConfiguration { | |||||||
|                 CheckUtils.throwIf(userContext.isPasswordExpired(), "密码已过期,请修改密码"); |                 CheckUtils.throwIf(userContext.isPasswordExpired(), "密码已过期,请修改密码"); | ||||||
|             })); |             })); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 配置 sa-token SaIgnore 注解排除路径 | ||||||
|  |      * <p>主要针对 @CrudRequestMapping 注解</p> | ||||||
|  |      */ | ||||||
|  |     @EventListener(ApplicationReadyEvent.class) | ||||||
|  |     public void configureSaTokenExcludes() { | ||||||
|  |         String[] beanNames = applicationContext.getBeanDefinitionNames(); | ||||||
|  |         List<String> additionalExcludes = Arrays.stream(beanNames).parallel().map(beanName -> { | ||||||
|  |             Object bean = applicationContext.getBean(beanName); | ||||||
|  |             Class<?> clazz = bean.getClass(); | ||||||
|  |             if (AopUtils.isAopProxy(bean)) { | ||||||
|  |                 clazz = AopProxyUtils.ultimateTargetClass(bean); | ||||||
|  |             } | ||||||
|  |             CrudRequestMapping crudRequestMapping = AnnotationUtils.findAnnotation(clazz, CrudRequestMapping.class); | ||||||
|  |             SaIgnore saIgnore = AnnotationUtils.findAnnotation(clazz, SaIgnore.class); | ||||||
|  |  | ||||||
|  |             if (crudRequestMapping != null && saIgnore != null) { | ||||||
|  |                 return crudRequestMapping.value() + "/**"; | ||||||
|  |             } | ||||||
|  |             return null; | ||||||
|  |         }).filter(Objects::nonNull).toList(); | ||||||
|  |         if (!additionalExcludes.isEmpty()) { | ||||||
|  |             // 合并现有的 excludes 和新扫描到的 | ||||||
|  |             List<String> allExcludes = new ArrayList<>(Arrays.asList(properties.getSecurity().getExcludes())); | ||||||
|  |             allExcludes.addAll(additionalExcludes); | ||||||
|  |             // 转回数组 | ||||||
|  |             properties.getSecurity().setExcludes(allExcludes.toArray(new String[0])); | ||||||
|  |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 liquor
					liquor