diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java new file mode 100644 index 0000000000..049d421052 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java @@ -0,0 +1,47 @@ +package org.jeecg.config; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.SpringApplicationRunListener; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; +import org.springframework.core.env.MutablePropertySources; +import org.springframework.core.env.PropertySource; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author eightmonth@qq.com + * @date 2024/4/8 11:37 + */ +public class DruidWallConfigRegister implements SpringApplicationRunListener { + + public SpringApplication application; + + private String[] args; + + + /** + * 必备,否则启动报错 + * @param application + * @param args + */ + public DruidWallConfigRegister(SpringApplication application, String[] args) { + this.application = application; + this.args = args; + } + + @Override + public void contextLoaded(ConfigurableApplicationContext context) { + ConfigurableEnvironment env = context.getEnvironment(); + Map props = new HashMap<>(); + props.put("spring.datasource.dynamic.druid.wall.selectWhereAlwayTrueCheck", false); + + MutablePropertySources propertySources = env.getPropertySources(); + + PropertySource> propertySource = new MapPropertySource("jeecg-datasource-config", props); + + propertySources.addLast(propertySource); + } +} \ No newline at end of file diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java index 9aed1bb70d..602259a863 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java @@ -16,18 +16,16 @@ import org.jeecg.config.JeecgBaseConfig; import org.jeecg.config.shiro.filters.CustomShiroFilterFactoryBean; import org.jeecg.config.shiro.filters.JwtFilter; -import org.springframework.aop.framework.Advised; import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.DependsOn; +import org.springframework.context.annotation.*; +import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.env.Environment; +import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; @@ -39,7 +37,6 @@ import javax.servlet.DispatcherType; import javax.servlet.Filter; import java.lang.reflect.Method; -import java.time.Duration; import java.util.*; /** @@ -50,6 +47,8 @@ @Slf4j @Configuration +// 免认证注解 @IgnoreAuth 注解生效范围配置 +@ComponentScan(basePackages = {"org.jeecg"}) public class ShiroConfig { @Resource @@ -60,9 +59,6 @@ public class ShiroConfig { private JeecgBaseConfig jeecgBaseConfig; @Autowired(required = false) private RedisProperties redisProperties; - - @Autowired - private ApplicationContext ctx; /** * Filter Chain定义说明 * @@ -177,13 +173,15 @@ public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { // 企业微信证书排除 filterChainDefinitionMap.put("/WW_verify*", "anon"); -// // 通过注解免登录url -// List ignoreAuthUrlList = collectIgnoreAuthUrl(ctx); -// if (!CollectionUtils.isEmpty(ignoreAuthUrlList)) { -// for (String url : ignoreAuthUrlList) { -// filterChainDefinitionMap.put(url, "anon"); -// } -// } + + // 通过注解免登录url + List ignoreAuthUrlList = collectIgnoreAuthUrl(); + if (!CollectionUtils.isEmpty(ignoreAuthUrlList)) { + for (String url : ignoreAuthUrlList) { + filterChainDefinitionMap.put(url, "anon"); + } + } + // 添加自己的过滤器并且取名为jwt Map filterMap = new HashMap(1); @@ -339,20 +337,27 @@ public IRedisManager redisManager() { @SneakyThrows - public List collectIgnoreAuthUrl(ApplicationContext context) { + public List collectIgnoreAuthUrl() { List ignoreAuthUrls = new ArrayList<>(); - Map controllers = context.getBeansWithAnnotation(RestController.class); - for (Object bean : controllers.values()) { - if (!(bean instanceof Advised)) { - continue; - } - Class beanClass = ((Advised) bean).getTargetSource().getTarget().getClass(); - RequestMapping base = beanClass.getAnnotation(RequestMapping.class); + ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); + provider.addIncludeFilter(new AnnotationTypeFilter(RestController.class)); + + // 获取当前类的扫描注解的配置 + Set components = new HashSet<>(); + for (String basePackage : AnnotationUtils.getAnnotation(ShiroConfig.class, ComponentScan.class).basePackages()) { + components.addAll(provider.findCandidateComponents(basePackage)); + } + + // 逐个匹配获取免认证路径 + for (BeanDefinition component : components) { + String beanClassName = component.getBeanClassName(); + Class clazz = Class.forName(beanClassName); + RequestMapping base = clazz.getAnnotation(RequestMapping.class); String[] baseUrl = {}; if (Objects.nonNull(base)) { baseUrl = base.value(); } - Method[] methods = beanClass.getDeclaredMethods(); + Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { if (method.isAnnotationPresent(IgnoreAuth.class) && method.isAnnotationPresent(RequestMapping.class)) { diff --git a/jeecg-boot-base-core/src/main/resources/META-INF/spring.factories b/jeecg-boot-base-core/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000000..8ba71de9f8 --- /dev/null +++ b/jeecg-boot-base-core/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.SpringApplicationRunListener=\ +org.jeecg.config.DruidWallConfigRegister \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/enums/RangeDateEnum.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/enums/RangeDateEnum.java index 4e6ed84eda..c5df7a2b4e 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/enums/RangeDateEnum.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/enums/RangeDateEnum.java @@ -79,6 +79,7 @@ public static Date[] getRangeArray(String key){ //本周 calendar1.set(Calendar.DAY_OF_WEEK, 2); + calendar2.set(Calendar.DAY_OF_WEEK,2); calendar2.add(Calendar.WEEK_OF_MONTH,1); calendar2.add(Calendar.DAY_OF_WEEK,-1); } else if(SZ.key.equals(key)){ diff --git a/pom.xml b/pom.xml index 3df21af725..678fa5b30d 100644 --- a/pom.xml +++ b/pom.xml @@ -565,4 +565,4 @@ - \ No newline at end of file +