修改DataSource訪問的數據源 對用戶名和密碼進行加密

目前在spring中加載propertioes文件中的數據庫資源的時候通常使用以下方式java

<context:property-placeholder location="classpath:jdbc.properties"/>

咱們可能會遇到數據庫用戶名和密碼的加密需求,因此特意寫一個博文來進行這樣的講解spring


在spring中有這樣一個方式ProepertyPlaceholderConfigurer方法  , 是用來加載上面配置文件方法的。咱們只須要繼承並重寫。其中的方法convertProperty。源代碼中這個方法的源碼爲數據庫

protected void convertProperties(Properties props) {
   Enumeration<?> propertyNames = props.propertyNames();
   while (propertyNames.hasMoreElements()) {
      String propertyName = (String) propertyNames.nextElement();
      String propertyValue = props.getProperty(propertyName);
      String convertedValue = convertProperty(propertyName, propertyValue);
      if (!ObjectUtils.nullSafeEquals(propertyValue, convertedValue)) {
         props.setProperty(propertyName, convertedValue);
      }
   }
}

protected String convertProperty(String propertyName, String propertyValue) {
   return convertPropertyValue(propertyValue);
}


咱們只須要對convertProperty方法進行重寫便可。進行用戶名和密碼的解密操做。ide

/**
 * 重寫PropertyPlaceholderConfigurer 方法 這個方法是加載
 *          <context:property-placeholder location="classpath:jdbc.properties"/>
 *
 * 從新其中的convertProperty 方法 在這個方法裏面進行字符串的解密
 *
 *
 * Created by abing on 2015/11/5.
 */
public class DescPropertyResourceConfigure extends PropertyPlaceholderConfigurer {


    /**
     * 返回解密之後文件類型
     * @param propertyName
     * @param propertyValue
     * @return
     */
    @Override
    protected String convertProperty(String propertyName, String propertyValue) {
        if (isDescStr(propertyName)){
            return CommonSecurity.decode(propertyValue);
        }

        return  propertyValue;
    }

    /**
     * 判斷獲取到的是否是指定的字段
     *
     * @param propertyName
     * @return
     */
    public static boolean isDescStr(String propertyName){
        boolean b = false;

        if (propertyName.indexOf(Constant.USERNAME) >= 0 ||
                propertyName.indexOf(Constant.PASSWORD) >= 0){
            b =true;
        }

        return b;
    }
    
}


代碼已經成功了。須要在spring的配置文件中進行配置。測試

配置有以下方式
加密

方式一 : spa

<bean id="descPropertyResourceConfigure"  class="com.inga.utils.properties.DescPropertyResourceConfigure"
      p:location="classpath:jdbc.properties"/>


方式二:.net

<bean id="descPropertyResourceConfigure" class="com.inga.utils.properties.DescPropertyResourceConfigure" >
   <property name="location" value="classpath:jdbc.properties"/>
</bean>


方式三:code

<bean id="descPropertyResourceConfigure" class="com.inga.utils.properties.DescPropertyResourceConfigure" >
  <property name="locations">
       <list>
            <value>classpath:jdbc.properties</value>
        </list>
    </property>
</bean>


配置完成之後便可進行測試。其中加解密的地方能夠參考個人博文blog

http://my.oschina.net/u/1023341/blog/526601

相關文章
相關標籤/搜索