【问题标题】:java spring - override property value received from property filejava spring - 覆盖从属性文件接收的属性值
【发布时间】:2016-05-15 20:36:59
【问题描述】:

我有一个场景,我从属性文件中获取编码的密码值。我有自己的解密实现,所以想从我的 java 类中解密密码,然后想进一步使用解密的值,在它被引用的地方。

例如 <bean id="myDataSource" class="org.apache.common.dbcp.BasicDataSource" ... // more attributed set from properties like user, hostname etc. p:password="${myPropertey.password}" >

上面的代码我需要实现类似下面的东西,特定于密码属性,因为其余属性很好,但密码需要在使用之前解密。

(下面的实现是错误的,但我只是为了给出更多和清晰的想法而提到)

<bean id="myDataSource" class="org.apache.common.dbcp.BasicDataSource" ... // more properties p:password="myDecryptBean.decryptMyPassword(${myPropertey.password})" >

基本上,我需要解密从属性文件中获取的密码,然后才能用于建立数据库连接。

感谢您的宝贵时间和任何帮助!

【问题讨论】:

    标签: java spring encryption properties


    【解决方案1】:

    由于您使用的是 Spring,我强烈建议您查看 PropertyResourceConfigurer 类。 请参阅Official Documentation

    特别是查看convertProperty(String propertyName, String propertyValue) 方法并考虑创建一个覆盖它的类。然后,您将能够将自定义解密逻辑添加到被覆盖的方法中,该方法将在 Spring 每次访问该属性时运行。

    直接来自文档:

    允许从属性资源(即属性文件)配置单个 bean 属性值。对于自定义配置文件很有用...覆盖在应用程序上下文中配置的 bean 属性。

    【讨论】:

      【解决方案2】:

      您需要创建一个自定义数据源对象来解密密码

      <bean id="myDataSource" class="foo.bar.PasswordDecryptingDataSource"
      ... // more properties
      p:encryptedPassword="${myPropertey.password}"
      >
      

      像这样实现foo.bar.PasswordDecryptingDataSource

      public class PasswordDecryptingDataSource extends org.apache.common.dbcp.BasicDataSource {
          private myDecryptBean; // inject your decryption bean somehow...
      
          public void setEncryptedPassword(String password) {
              super.setPassword(myDecryptBean.decryptMyPassword(password))
          }
      }
      

      【讨论】:

        【解决方案3】:

        布赖恩,塞缪尔

        非常感谢您的快速帮助,这两种方法都可以解决我的情况。

        我已经实现了扩展 PropertyPlaceholderConfigurer,考虑将来是否有更多的属性我可以得到编码,并且不想将解密逻辑限制为 DataSource。

        只需我的 2 美分代码 sn-ps,我已经实现,它可以帮助可能会发现类似情况的人。

        <bean class="com.foo.spring.util.PropertyUtil"> <property name="location"> <value>file:${foo.config.location}</value> </property> </bean>

        下面是类

        `公共类 PropertyUtil 扩展 PropertyPlaceholderConfigurer {

        @Override
        public String convertProperty(String propertyName, String propertyValue){
            return super.convertProperty(propertyName, decrypt(propertyValue));
        }
        
        
        private String decrypt(String){
        // logical implementation
        }
        

        `

        【讨论】:

          【解决方案4】:

          我觉得这个线程在这个 PropertyConvertValue 上对我很有帮助。 source of discussion

          快速参考: 如果有人觉得有帮助,这是我正在使用的解决方法:

          protected void doProcessProperties(ConfigurableListableBeanFactory beanFactoryToProcess,
                                             final StringValueResolver valueResolver) {
          
              super.doProcessProperties(beanFactoryToProcess,
                      new StringValueResolver() {
                          @Override
                          public String resolveStringValue(String strVal) {
                              return convertPropertyValue(valueResolver.resolveStringValue(strVal));
                          }
                      }
              );
          }
          
          
          
          
           @Override
          protected String convertPropertyValue(String originalValue) {
              String value = decrypt(originalValue);
              return value;
          }
           
          private String decrypt(String value){
           //... write decryption logic here
          
          }
          

          类 CustomClass 扩展 PropertySourcesPlaceholderConfigurer

          并覆盖 doProcessProperties(ConfigurableListableBeanFactory beanFactoryToProcess, final StringValueResolver valueResolver)

          【讨论】:

            猜你喜欢
            • 2016-08-07
            • 2012-09-05
            • 1970-01-01
            • 2013-08-16
            • 2012-07-23
            • 2011-09-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多