首页 > 其他分享 >多数据源加密(90%来自文心一言)

多数据源加密(90%来自文心一言)

时间:2024-03-19 18:56:29浏览次数:21  
标签:加密 String 自定义 数据源 配置 解密 文心 90% EnvironmentPostProcessor

dynamic-datasource-spring-boot-starter 3.2.0 中,如果你希望对加密的密码进行自定义解密,你需要实现自己的 PropertySourceLocator 或者自定义配置解析逻辑,以便在读取配置时能够自动解密密码。

以下是实现自定义解密逻辑的一般步骤:

  1. 创建自定义的解密工具类

首先,你需要一个能够解密密码的工具类。这个类应该有一个方法,接收加密的字符串并返回解密后的字符串。

public class CustomDecryptor {
    public String decrypt(String encryptedPassword) {
        // 实现你的解密逻辑
        // 假设你已经有了加密时使用的密钥和算法
        String decryptedPassword = ...; // 解密后的密码
        return decryptedPassword;
    }
}
  1. 自定义配置解析

然后,你需要自定义配置解析逻辑,以便在读取数据源配置时能够调用解密工具类。这通常意味着你需要重写或扩展 Spring Boot 的某些配置绑定逻辑。

一种方法是实现 EnvironmentPostProcessor 接口,并在其中添加自定义的 PropertySource

public class CustomDecryptEnvironmentPostProcessor implements EnvironmentPostProcessor {

    private final CustomDecryptor decryptor = new CustomDecryptor();

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        MutablePropertySources propertySources = environment.getPropertySources();
        Map<String, Object> decryptedProperties = new HashMap<>();
        
        // 遍历所有属性源,找到需要解密的属性
        for (PropertySource<?> propertySource : propertySources) {
            if (propertySource instanceof MapPropertySource) {
                MapPropertySource mapPropertySource = (MapPropertySource) propertySource;
                for (String key : mapPropertySource.getSource().keySet()) {
                    if (key.endsWith(".password")) { // 假设所有密码属性都以 .password 结尾
                        String encryptedValue = mapPropertySource.getSource().get(key).toString();
                        String decryptedValue = decryptor.decrypt(encryptedValue);
                        decryptedProperties.put(key, decryptedValue);
                    }
                }
            }
        }
        
        // 添加解密后的属性到新的属性源中
        PropertySource<?> decryptedPropertySource = new MapPropertySource("DECRYPTED_PROPERTIES", decryptedProperties);
        propertySources.addFirst(decryptedPropertySource);
    }
}
  1. 注册自定义的 EnvironmentPostProcessor

你需要在 resources/META-INF/spring.factories 文件中注册你的 EnvironmentPostProcessor

org.springframework.boot.env.EnvironmentPostProcessor=\
com.yourpackage.CustomDecryptEnvironmentPostProcessor

这样,当 Spring Boot 应用启动时,它会调用你的 EnvironmentPostProcessor,并在读取配置之前对密码进行解密。

请注意,上面的代码只是一个示例,你需要根据你的具体需求调整解密逻辑和属性匹配规则。此外,确保你的解密工具类足够安全,密钥管理得当,以防止任何潜在的安全风险。

另外,如果你使用的是 Spring Cloud Config 或其他外部配置中心,你可能需要在从配置中心读取配置后、绑定到 Spring Environment 之前进行解密。这通常涉及到自定义配置客户端或拦截配置加载过程。

标签:加密,String,自定义,数据源,配置,解密,文心,90%,EnvironmentPostProcessor
From: https://www.cnblogs.com/yuanyunjing/p/18083696

相关文章

  • 【Database】基于Mybatis的多数据源连接实现方式
    场景出于种种原因有些时候我们的项目中会用到同时连接多个数据源的情况,比如数据太大了分了多个库,又比如统计任务只能读原始数据的数据库,写只能在统计结果的库中。设计思路基于mybatis我们的方案是这样的,需要自己实现一个SqlSessionTemplate,里面维护了一个dbId到SqlSessionFact......
  • 【Database】可选的数据源配置项
    【Database】可选的数据源配置项场景之前的版本中没有数据源依赖,新版本中有数据源依赖,只有部分模块需要配置数据源,其余模块仍然读老的配置,如果使用自动装配的mybatis会启动报错。方案通过一个默认为false的开关控制数据源的加载@Configuration@MapperScan(basePackages={"......
  • P9077 [PA2018] Poddrzewo 题解
    思考感觉题目有点迷惑的意思,要最小化操作\(1\)使用的次数,也就是要节约修改操作,让我们认为操作\(1\)是最有用的,其实只要稍微动动脑子想一想,删除操作才是最有用的,而交换操作根本没用。当将序列删除到只剩两个点时,就把两个点连上,度都为\(1\)。所以如果序列中\(1\)的数量超......
  • 【SQL】1907. 按分类统计薪水(IF语句;CASE 语句;UNION)
    前述知识点回顾:casewhenthenelseendMysql:条件判断函数-CASEWHEN、IF、IFNULL详解题目描述leetcode题目:1907.按分类统计薪水1.写法一:if语句select'LowSalary'ascategory,sum(if(income<20000,1,0))asaccounts_countfromAccountsuni......
  • 文心一言 VS 讯飞星火 VS chatgpt (217)-- 算法导论16.2 4题
    四、Gekko教授一直梦想用直排轮滑的方式横穿北达科他州。他计划沿U.S.2号高速公路横穿,这条高速公路从明尼苏达州东部边境的大福克斯市到靠近蒙大拿州西部边境的威利斯顿市。教授计划带两公升水,在喝光水之前能滑行m英里(由于北达科他州地势相对平坦,教授无需担心在上坡路段喝......
  • i9-14900KS超频破9.1GHz!连创四大世界记录
    Intel日前正式发布了预设频率高达6.4GHz的限量版i9-14900KS,但这远远不是它的极限,华硕ROG超频团队就迅速把它推到了9.1GHz的高度。Elmor领导的ROG超频团队,利用自家的ROGMAXIMUSZ790APEX主板,成功让i9-14900KS跑出了9117.75MHz的高频率(外频100.19MHz/倍频91x),并通过了CPU-Z认证......
  • lc907 子数组的最小值之和
    给定数组arr[n],求所有子数组中最小值的和,答案对1e9+7取模。1<=n<=30000;1<=arr[i]<=30000考虑每个数作为最小值对应的子数组有多少个,计算对答案的贡献,而子数组的个数可以用单调栈来维护。数组元素可能相同,为了避免重复计数,用半开半闭区间。classSolution{public:ints......
  • 文心一言 VS 讯飞星火 VS chatgpt (216)-- 算法导论16.2 3题
    三、假定在0-1背包问题中,商品的重量递增序与价值递减序完全一样。设计一个高效算法求此背包问题的变形的最优解,证明你的算法是正确的。如果要写代码,请用go语言。文心一言:在0-1背包问题中,如果商品的重量递增序与价值递减序完全一样,那么我们可以利用这个特性设计一种高效的算法......
  • 【业务功能篇】多环境配置、多数据源切换失效@DS解决方式
     多环境配置通过resources资源目录--config目录,我们分成了开发生产测试三个,不过一般我们都是测试环境进行测试数据库,本地开发环境就是连接测试环境 根据三个不同的环境,注意命名规范:application-xxx.yml,这样在我们的app配置文件就可以指定后缀这个值xxx就表示要运行哪个......
  • Codeforces Round 908 (Div. 2)
    CodeforcesRound908(Div.2)A-SecretSport解题思路:有一说一,没看很懂,感觉最后赢的就是赢了。。。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingpiii=pair<ll,pa......