SPRING 数据库密码加密存储 在配置文件的两种方式 下一篇第二种方式-阿里云开发者社区

开发者社区> wulinzhen> 正文

SPRING 数据库密码加密存储 在配置文件的两种方式 下一篇第二种方式

简介: SPRING 数据库密码加密存储 在配置文件的两种方式
+关注继续查看

分析

SPRING通过

1.property-placeholder spring3.1以前实现是PropertyPlaceholderConfigurer,3.1以后是PropertySourcesPlaceholderConfigurer

<context:property-placeholder local-override="true" properties-ref="dataSourceProperties"
 file-encoding="UTF-8" location="classpath:loc/config.properties"
 ignore-resource-not-found="true" />

2 3.1后PropertySourcesPlaceholderConfigurer支持加载通配符*

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer" p:location="classpath*:loc/*.properties"></bean> 

按ctrl点击标签可以看到spring-context.xsd中的详细信息。

PropertySourcesPlaceholderConfigurer类经过一系列继承关系,实质是一个容器后管理器。debug走里面的一段代码如下:

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
 if (this.propertySources == null) {
 this.propertySources = new MutablePropertySources();
 if (this.environment != null) {
 this.propertySources.addLast(new PropertySource<Environment>("environmentProperties", this.environment) {
 @Nullable
 public String getProperty(String key) {
 return ((Environment)this.source).getProperty(key);
 }
 });
 }

 try {
 PropertySource<?> localPropertySource = new PropertiesPropertySource("localProperties", this.mergeProperties());
 if (this.localOverride) {
 this.propertySources.addFirst(localPropertySource);
 } else {
 this.propertySources.addLast(localPropertySource);
 }
 } catch (IOException var3) {
 throw new BeanInitializationException("Could not load properties", var3);
 }
 }

 this.processProperties(beanFactory, (ConfigurablePropertyResolver)(new PropertySourcesPropertyResolver(this.propertySources)));
 this.appliedPropertySources = this.propertySources;
 }

进入这个mergeProperties()方法里面看:

 protected Properties mergeProperties() throws IOException {
 Properties result = new Properties();
 if (this.localOverride) {
 this.loadProperties(result);
 }

 if (this.localProperties != null) {
 Properties[] var2 = this.localProperties;
 int var3 = var2.length;

 for(int var4 = 0; var4 < var3; ++var4) {
 Properties localProp = var2[var4];
 CollectionUtils.mergePropertiesIntoMap(localProp, result);
 }
 }

 if (!this.localOverride) {
 this.loadProperties(result);
 }

 return result;
 }

可以看到localOverride这个属性是用来控制是否覆盖Spring读取的属性配置。并且下面紧跟着判断this.localProperties!=null,如果localProperties不为null的话,会读取这些配置信息到spring容易中并且覆盖spring中已存在的属性。


<!-- 这里的local-override="true" 就是覆盖spring容器中已存在的属性,properties-ref="dataSourceProperties" 是指定自己的properties -->
 <context:property-placeholder local-override="true" properties-ref="dataSourceProperties"
 file-encoding="UTF-8" location="classpath:loc/config.properties"
 ignore-resource-not-found="true" />
 <!-- 这个类是我自定义的,用来解密jdbc.properties中的属性之后然后存放到Properties类中 -->
 <bean id="dataSourceProperties" class="com.spring.demo.utils.DataSourceProperties">
 <constructor-arg value="encrypt.jdbc.password"/>
 </bean>

下面是我的DataSourceProperties类


package com.spring.demo.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.Properties;

/**
 * 数据源配置参数处理
 * <p/>
 * 配置信息事先被DES加密处理,需要在此解密然后绑定到数据源
 * Created by Alvin on 2016/7/31.
 */
public class DataSourceProperties extends Properties {
 protected static final Logger logger = LoggerFactory.getLogger(AesUtils.class);
 /**
 * 构造方法
 * @param propertyNames 需要解密的属性名称
 */
 public DataSourceProperties(String[] propertyNames) {
 try {
 this.load(DataSourceProperties.class.getClassLoader()
 .getResourceAsStream("loc/config.properties"));
 for (String propertyName : propertyNames) {
 decrypt(propertyName);
 }
 } catch (IOException e) {
 logger.error(e.getMessage(),e);
 }
 }

 /**
 * 解密
 */
 private void decrypt(String propertyName) {
 logger.info("propertyName({}),value({})",propertyName,this.getProperty(propertyName));
 if (isEncryptPropertyVal(propertyName)){
 String value = AesUtils.decrypt(this.getProperty(propertyName), AesUtils.key);
 logger.info("propertyName({}),propertyValue({}),",propertyName,value);
 this.setProperty(propertyName, value);
 }
 }

 /**
 * 判断属性值是否需要解密,这里我约定需要解密的属性名用encrypt开头
 * @param propertyName
 * @return
 */
 private boolean isEncryptPropertyVal(String propertyName){
 if(propertyName.indexOf("encrypt") >= 0){
 return true;
 }else{
 return false;
 }
 }

}


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Maven项目中无法找到 xml文件或 properties文件等配置文件的解决方法
在初次使用 Maven 项目的时候总是会遇到一些比较奇异的问题 就比如说总是会报错:项目里的 **.xml 或 **.properties 配置文件无法找到 这时你去项目中的 classes 生成文件(target 或 out)中找,确实这些配置文件没有被编译 这是因为 ...
1424 0
刨析Maven(对pom.xml配置文件常用标签的解析)
  昨天在阿里云看到了一句话,“当你Learning和Trying之后,如果能尽量把Teaching也做好,会促进我们思考”。共勉!   这是关于Maven的第三篇博客,这次我们深入了解pom.xml配置文件,它是Maven项目的基础文件,也是最为重要的文件。
1363 0
Spring Security笔记:使用BCrypt算法加密存储登录密码
在前一节使用数据库进行用户认证(form login using database)里,我们学习了如何把“登录帐号、密码”存储在db中,但是密码都是明文存储的,显然不太讲究。这一节将学习如何使用spring security3新加入的bcrypt算法,将登录加密存储到db中,并正常通过验证。
1627 0
linux和windows互传文件/用户配置文件和密码配置文件/用户组管理/用户管理
2.27linux和windows互传文件 3.1 用户配置文件和密码配置文件 3.2 用户组管理 3.3 用户管理 linux和windows互传文件 显示日期date [root@centos_1 ~]# date 2017年 11月 21日 星期二 08:38:...
1063 0
全球最大的已泄漏密码库现可公开访问下载:你的密码有人泄漏过吗?
本文讲的是全球最大的已泄漏密码库现可公开访问下载:你的密码有人泄漏过吗?,前不久美国国家标准和技术协会(NIST)发布《数字身份验证指南(DAG)》的最新草案,建议企业定期检查用户是否使用了已泄漏密码。
4500 0
spring多数据源的配置(转)
C3P0和DBCP的区别   C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
876 0
+关注
7
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载