瀏覽代碼

+ 1、fastjson 反序列化增加序列化白名单
2、修改动态多数据源依赖的问题

chen.cheng 6 月之前
父節點
當前提交
86348f6725

+ 8 - 8
common-application/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java

@@ -1,15 +1,15 @@
 package com.ruoyi.common.constant;
 
-import java.util.Locale;
 import io.jsonwebtoken.Claims;
 
+import java.util.Locale;
+
 /**
  * 通用常量信息
- * 
+ *
  * @author ruoyi
  */
-public class Constants
-{
+public class Constants {
     /**
      * UTF-8 字符集
      */
@@ -158,16 +158,16 @@ public class Constants
     /**
      * 自动识别json对象白名单配置(仅允许解析的包名,范围越小越安全)
      */
-    public static final String[] JSON_WHITELIST_STR = { "org.springframework", "com.ruoyi" };
+    public static final String[] JSON_WHITELIST_STR = {"org.springframework", "com.ruoyi", "com.huashe"};
 
     /**
      * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
      */
-    public static final String[] JOB_WHITELIST_STR = { "com.ruoyi.quartz.task" };
+    public static final String[] JOB_WHITELIST_STR = {"com.ruoyi.quartz.task"};
 
     /**
      * 定时任务违规的字符
      */
-    public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
-            "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config", "com.ruoyi.generator" };
+    public static final String[] JOB_ERROR_STR = {"java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
+            "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config", "com.ruoyi.generator"};
 }

+ 0 - 19
common-application/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java

@@ -1,19 +0,0 @@
-package com.ruoyi.common.enums;
-
-/**
- * 数据源
- * 
- * @author ruoyi
- */
-public enum DataSourceType
-{
-    /**
-     * 主库
-     */
-    MASTER,
-
-    /**
-     * 从库
-     */
-    SLAVE
-}

+ 3 - 3
common-application/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java

@@ -1,7 +1,7 @@
 package com.ruoyi.framework.aspectj;
 
+import com.huashe.common.annotation.DataSource;
 import com.huashe.common.utils.StringUtils;
-import com.ruoyi.common.annotation.DataSource;
 import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
@@ -28,8 +28,8 @@ public class DataSourceAspect
 {
     protected Logger logger = LoggerFactory.getLogger(getClass());
 
-    @Pointcut("@annotation(com.ruoyi.common.annotation.DataSource)"
-            + "|| @within(com.ruoyi.common.annotation.DataSource)")
+    @Pointcut("@annotation(com.huashe.common.annotation.DataSource)"
+            + "|| @within(com.huashe.common.annotation.DataSource)")
     public void dsPointCut()
     {
 

+ 64 - 47
common-application/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java

@@ -1,41 +1,40 @@
 package com.ruoyi.framework.config;
 
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.sql.DataSource;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.boot.web.servlet.FilterRegistrationBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
 import com.alibaba.druid.pool.DruidDataSource;
 import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
 import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
 import com.alibaba.druid.util.Utils;
-import com.ruoyi.common.enums.DataSourceType;
+import com.huashe.common.enums.DataSourceType;
 import com.ruoyi.common.utils.SpringUtils;
 import com.ruoyi.framework.config.properties.DruidProperties;
 import com.ruoyi.framework.datasource.DynamicDataSource;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * druid 配置多数据源
- * 
+ *
  * @author ruoyi
  */
 @Configuration
-public class DruidConfig
-{
+public class DruidConfig {
     @Bean
     @ConfigurationProperties("spring.datasource.druid.master")
-    public DataSource masterDataSource(DruidProperties druidProperties)
-    {
+    public DataSource masterDataSource(DruidProperties druidProperties) {
         DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
         return druidProperties.dataSource(dataSource);
     }
@@ -43,49 +42,69 @@ public class DruidConfig
     @Bean
     @ConfigurationProperties("spring.datasource.druid.slave")
     @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
-    public DataSource slaveDataSource(DruidProperties druidProperties)
-    {
+    public DataSource slaveDataSource(DruidProperties druidProperties) {
+        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
+        return druidProperties.dataSource(dataSource);
+    }
+
+    @Bean
+    @ConfigurationProperties("spring.datasource.druid.ems")
+    @ConditionalOnProperty(prefix = "spring.datasource.druid.ems", name = "enabled", havingValue = "true")
+    public DataSource emsDataSource(DruidProperties druidProperties) {
+        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
+        return druidProperties.dataSource(dataSource);
+    }
+
+    @Bean
+    @ConfigurationProperties("spring.datasource.druid.pkb")
+    @ConditionalOnProperty(prefix = "spring.datasource.druid.pkb", name = "enabled", havingValue = "true")
+    public DataSource pkbDataSource(DruidProperties druidProperties) {
+        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
+        return druidProperties.dataSource(dataSource);
+    }
+
+    @Bean
+    @ConfigurationProperties("spring.datasource.druid.aiot")
+    @ConditionalOnProperty(prefix = "spring.datasource.druid.aiot", name = "enabled", havingValue = "true")
+    public DataSource aiotDataSource(DruidProperties druidProperties) {
         DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
         return druidProperties.dataSource(dataSource);
     }
 
     @Bean(name = "dynamicDataSource")
     @Primary
-    public DynamicDataSource dataSource(DataSource masterDataSource)
-    {
+    public DynamicDataSource dataSource(DataSource masterDataSource) {
         Map<Object, Object> targetDataSources = new HashMap<>();
         targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
         setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
+        setDataSource(targetDataSources, DataSourceType.EMS.name(), "emsDataSource");
+        setDataSource(targetDataSources, DataSourceType.PKB.name(), "pkbDataSource");
+        setDataSource(targetDataSources, DataSourceType.AIOT.name(), "aiotDataSource");
         return new DynamicDataSource(masterDataSource, targetDataSources);
     }
-    
+
     /**
      * 设置数据源
-     * 
+     *
      * @param targetDataSources 备选数据源集合
-     * @param sourceName 数据源名称
-     * @param beanName bean名称
+     * @param sourceName        数据源名称
+     * @param beanName          bean名称
      */
-    public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName)
-    {
-        try
-        {
+    public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName) {
+        try {
             DataSource dataSource = SpringUtils.getBean(beanName);
             targetDataSources.put(sourceName, dataSource);
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
         }
     }
 
     /**
      * 去除监控页面底部的广告
      */
-    @SuppressWarnings({ "rawtypes", "unchecked" })
+    @SuppressWarnings({"rawtypes", "unchecked"})
     @Bean
     @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true")
-    public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties)
-    {
+    public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) {
         // 获取web监控页面的参数
         DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
         // 提取common.js的配置路径
@@ -93,16 +112,14 @@ public class DruidConfig
         String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
         final String filePath = "support/http/resources/js/common.js";
         // 创建filter进行过滤
-        Filter filter = new Filter()
-        {
+        Filter filter = new Filter() {
             @Override
-            public void init(javax.servlet.FilterConfig filterConfig) throws ServletException
-            {
+            public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
             }
+
             @Override
             public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-                    throws IOException, ServletException
-            {
+                    throws IOException, ServletException {
                 chain.doFilter(request, response);
                 // 重置缓冲区,响应头不会被重置
                 response.resetBuffer();
@@ -113,9 +130,9 @@ public class DruidConfig
                 text = text.replaceAll("powered.*?shrek.wang</a>", "");
                 response.getWriter().write(text);
             }
+
             @Override
-            public void destroy()
-            {
+            public void destroy() {
             }
         };
         FilterRegistrationBean registrationBean = new FilterRegistrationBean();

+ 3 - 5
common-application/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java

@@ -11,7 +11,7 @@ import org.springframework.data.redis.serializer.StringRedisSerializer;
 
 /**
  * redis配置
- * 
+ *
  * @author ruoyi
  */
 @Configuration
@@ -40,8 +40,7 @@ public class RedisConfig extends CachingConfigurerSupport
     }
 
     @Bean
-    public DefaultRedisScript<Long> limitScript()
-    {
+    public DefaultRedisScript<Long> limitScript() {
         DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
         redisScript.setScriptText(limitScriptText());
         redisScript.setResultType(Long.class);
@@ -51,8 +50,7 @@ public class RedisConfig extends CachingConfigurerSupport
     /**
      * 限流脚本
      */
-    private String limitScriptText()
-    {
+    private String limitScriptText() {
         return "local key = KEYS[1]\n" +
                 "local count = tonumber(ARGV[1])\n" +
                 "local time = tonumber(ARGV[2])\n" +

+ 2 - 2
common-application/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java

@@ -4,16 +4,16 @@ import java.util.Collection;
 import java.util.List;
 import javax.annotation.PostConstruct;
 
+import com.huashe.common.annotation.DataSource;
 import com.huashe.common.constant.CacheConstants;
 import com.huashe.common.constant.UserConstants;
+import com.huashe.common.enums.DataSourceType;
 import com.huashe.common.exception.ServiceException;
 import com.huashe.common.text.Convert;
 import com.huashe.common.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.ruoyi.common.annotation.DataSource;
 import com.ruoyi.common.core.redis.RedisCache;
-import com.ruoyi.common.enums.DataSourceType;
 import com.ruoyi.system.domain.SysConfig;
 import com.ruoyi.system.mapper.SysConfigMapper;
 import com.ruoyi.system.service.ISysConfigService;

+ 4 - 2
common-application/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java → prod-common/src/main/java/com/huashe/common/annotation/DataSource.java

@@ -1,4 +1,7 @@
-package com.ruoyi.common.annotation;
+package com.huashe.common.annotation;
+
+
+import com.huashe.common.enums.DataSourceType;
 
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
@@ -6,7 +9,6 @@ import java.lang.annotation.Inherited;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
-import com.ruoyi.common.enums.DataSourceType;
 
 /**
  * 自定义多数据源切换注解

+ 33 - 0
prod-common/src/main/java/com/huashe/common/enums/DataSourceType.java

@@ -0,0 +1,33 @@
+package com.huashe.common.enums;
+
+/**
+ * 数据源
+ *
+ * @author ruoyi
+ */
+public enum DataSourceType {
+    /**
+     * 主库
+     */
+    MASTER,
+
+    /**
+     * 从库
+     */
+    SLAVE,
+
+    /**
+     * EMS库
+     */
+    EMS,
+
+    /**
+     * PKB库
+     */
+    PKB,
+
+    /**
+     * AIOT库
+     */
+    AIOT;
+}