diff --git a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java b/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java index 7674baa8ca49b88adacb3f0676bfda7eb3353a00..f9f2caa40e7f533308b2485865041064105dd29e 100644 --- a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java +++ b/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java @@ -136,6 +136,8 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon private final ObjectProvider magicNotifyServiceProvider; + private final ObjectProvider dataSourceEncryptProvider; + private final Environment environment; private final MagicCorsFilter magicCorsFilter = new MagicCorsFilter(); @@ -171,6 +173,7 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon ObjectProvider magicNotifyServiceProvider, ObjectProvider authorizationInterceptorProvider, ObjectProvider> namedTableInterceptorsProvider, + ObjectProvider dataSourceEncryptProvider, Environment environment, ApplicationContext applicationContext ) { @@ -185,6 +188,7 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon this.magicNotifyServiceProvider = magicNotifyServiceProvider; this.authorizationInterceptorProvider = authorizationInterceptorProvider; this.namedTableInterceptorsProvider = namedTableInterceptorsProvider; + this.dataSourceEncryptProvider = dataSourceEncryptProvider; this.environment = environment; this.applicationContext = applicationContext; } @@ -400,7 +404,7 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon MagicFunctionManager magicFunctionManager, Resource workspace, MagicBackupService magicBackupService) { - return new DefaultMagicAPIService(mappingHandlerMapping, apiServiceProvider, functionServiceProvider, groupServiceProvider, resultProvider, magicDynamicDataSource, magicFunctionManager, magicNotifyServiceProvider.getObject(), properties.getClusterConfig().getInstanceId(), workspace, magicBackupService, properties.isThrowException()); + return new DefaultMagicAPIService(mappingHandlerMapping, apiServiceProvider, functionServiceProvider, groupServiceProvider, resultProvider, magicDynamicDataSource, magicFunctionManager, magicNotifyServiceProvider.getObject(), properties.getClusterConfig().getInstanceId(), workspace, magicBackupService, dataSourceEncryptProvider.getIfAvailable() , properties.isThrowException()); } /** diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/provider/DataSourceEncryptProvider.java b/magic-api/src/main/java/org/ssssssss/magicapi/provider/DataSourceEncryptProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..04f79154f2b6432580aa13a4dd4c894e45b88295 --- /dev/null +++ b/magic-api/src/main/java/org/ssssssss/magicapi/provider/DataSourceEncryptProvider.java @@ -0,0 +1,23 @@ +package org.ssssssss.magicapi.provider; + +import org.ssssssss.magicapi.model.DataSourceInfo; + +/** + * 数据源加解密 + * + * @since 1.7.0 + */ +public interface DataSourceEncryptProvider { + + /** + * 加密 + * @param dataSourceInfo 数据源信息 + */ + void encrypt(DataSourceInfo dataSourceInfo); + + /** + * 解密 + * @param dataSourceInfo 数据源信息 + */ + void decrypt(DataSourceInfo dataSourceInfo); +} diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/provider/impl/DefaultMagicAPIService.java b/magic-api/src/main/java/org/ssssssss/magicapi/provider/impl/DefaultMagicAPIService.java index 7d41299bd28a87468f82864e9037e560f9b99f13..e0a3da07f1d16a100b205bac4976a03bd8404eac 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/provider/impl/DefaultMagicAPIService.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/provider/impl/DefaultMagicAPIService.java @@ -82,6 +82,7 @@ public class DefaultMagicAPIService implements MagicAPIService, JsonCodeConstant private final Resource workspace; private final Resource datasourceResource; private final MagicBackupService backupService; + private final DataSourceEncryptProvider dataSourceEncryptProvider; public DefaultMagicAPIService(MappingHandlerMapping mappingHandlerMapping, ApiServiceProvider apiServiceProvider, @@ -94,6 +95,7 @@ public class DefaultMagicAPIService implements MagicAPIService, JsonCodeConstant String instanceId, Resource workspace, MagicBackupService backupService, + DataSourceEncryptProvider dataSourceEncryptProvider, boolean throwException) { this.mappingHandlerMapping = mappingHandlerMapping; this.apiServiceProvider = apiServiceProvider; @@ -106,6 +108,7 @@ public class DefaultMagicAPIService implements MagicAPIService, JsonCodeConstant this.workspace = workspace; this.throwException = throwException; this.instanceId = instanceId; + this.dataSourceEncryptProvider = dataSourceEncryptProvider; this.backupService = backupService; this.datasourceResource = workspace.getDirectory(PATH_DATASOURCE); if (!this.datasourceResource.exists()) { @@ -462,6 +465,9 @@ public class DefaultMagicAPIService implements MagicAPIService, JsonCodeConstant private String registerDataSource(DataSourceInfo properties) { if (properties != null) { + if(dataSourceEncryptProvider != null){ + dataSourceEncryptProvider.decrypt(properties); + } String key = properties.get("key"); String name = properties.getOrDefault("name", key); String dsId = properties.remove("id"); @@ -535,6 +541,9 @@ public class DefaultMagicAPIService implements MagicAPIService, JsonCodeConstant // 注册数据源 magicDynamicDataSource.put(dsId, key, name, createDataSource(properties), maxRows); properties.put("id", dsId); + if(dataSourceEncryptProvider != null){ + dataSourceEncryptProvider.encrypt(properties); + } datasourceResource.getResource(dsId + ".json").write(JsonUtils.toJsonString(properties)); backupService.backup(properties); magicNotifyService.sendNotify(new MagicNotify(instanceId, dsId, action, NOTIFY_ACTION_DATASOURCE));