Skip to content

Commit

Permalink
Merge pull request #6007 from EightMonth/master
Browse files Browse the repository at this point in the history
修复 #5901
  • Loading branch information
zhangdaiscott authored Apr 8, 2024
2 parents ab49983 + b69a716 commit ea6927a
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 28 deletions.
Original file line number Diff line number Diff line change
@@ -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 [email protected]
* @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<String, Object> props = new HashMap<>();
props.put("spring.datasource.dynamic.druid.wall.selectWhereAlwayTrueCheck", false);

MutablePropertySources propertySources = env.getPropertySources();

PropertySource<Map<String, Object>> propertySource = new MapPropertySource("jeecg-datasource-config", props);

propertySources.addLast(propertySource);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand All @@ -39,7 +37,6 @@
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import java.lang.reflect.Method;
import java.time.Duration;
import java.util.*;

/**
Expand All @@ -50,6 +47,8 @@

@Slf4j
@Configuration
// 免认证注解 @IgnoreAuth 注解生效范围配置
@ComponentScan(basePackages = {"org.jeecg"})
public class ShiroConfig {

@Resource
Expand All @@ -60,9 +59,6 @@ public class ShiroConfig {
private JeecgBaseConfig jeecgBaseConfig;
@Autowired(required = false)
private RedisProperties redisProperties;

@Autowired
private ApplicationContext ctx;
/**
* Filter Chain定义说明
*
Expand Down Expand Up @@ -177,13 +173,15 @@ public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
// 企业微信证书排除
filterChainDefinitionMap.put("/WW_verify*", "anon");

// // 通过注解免登录url
// List<String> ignoreAuthUrlList = collectIgnoreAuthUrl(ctx);
// if (!CollectionUtils.isEmpty(ignoreAuthUrlList)) {
// for (String url : ignoreAuthUrlList) {
// filterChainDefinitionMap.put(url, "anon");
// }
// }

// 通过注解免登录url
List<String> ignoreAuthUrlList = collectIgnoreAuthUrl();
if (!CollectionUtils.isEmpty(ignoreAuthUrlList)) {
for (String url : ignoreAuthUrlList) {
filterChainDefinitionMap.put(url, "anon");
}
}


// 添加自己的过滤器并且取名为jwt
Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
Expand Down Expand Up @@ -339,20 +337,27 @@ public IRedisManager redisManager() {


@SneakyThrows
public List<String> collectIgnoreAuthUrl(ApplicationContext context) {
public List<String> collectIgnoreAuthUrl() {
List<String> ignoreAuthUrls = new ArrayList<>();
Map<String, Object> 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<BeanDefinition> 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)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
org.springframework.boot.SpringApplicationRunListener=\
org.jeecg.config.DruidWallConfigRegister
Original file line number Diff line number Diff line change
Expand Up @@ -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)){
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -565,4 +565,4 @@
</modules>
</profile>
</profiles>
</project>
</project>

0 comments on commit ea6927a

Please sign in to comment.