日期:2014-05-16  浏览次数:20392 次

hibernate使用连接池并且处理数据库密码加密
hibernate使用连接池并且处理数据库密码加密
明文密码太不安全使用加密吧!~ 
在使用  hibernate框架时怎么来处理密码呢?
 首先我们要找一个切入点 就是 连接池在什么时间读的配置 
这个时候我们解密在给他 看hibernate配置   
<property name="hibernate.connection.provider_class">    
	org.hibernate.connection.C3P0ConnectionProvider  
 </property> 
这就是hibernate把连接交给专门的连接池类来负责 我们就在这里动手脚   
<property name="hibernate.connection.provider_class">    
	name.ixr.connection.C3P0ConnectionProvider   
</property> 
这里换成我们自己的类,当然这个类要有原有类的功能 这里我们想到一个方法使用继承

package name.ixr.connection; 
import java.util.Properties; 
import org.hibernate.cfg.Environment; 
import name.ixr.util.EncUtil; 
/** 
* 自定义C3P0处理 
* 2009-10-10 
* @author IXR 
* @version 1.0 
*/ 
public class C3P0ConnectionProvider extends org.hibernate.connection.C3P0ConnectionProvider { 
} 
}

类有了怎么处理呢? 还有原有的类有什么方法? 需要下载 hibernate  code查看 我看了他的方法 大概了解了下 知道 hibernate读取完配置文件把配置文件对象交给了configure这个方法 然后重构这个方法,实现原来的太麻烦,就算复制代码太多我们只处理中间的一个环节所以没有 必要完全重写,我们用多态吧,都继承了也是为什么上边我用继承,看我怎么写的

/**
* 修改读取配置文件的业务 
* 这里主要为了解密密码 
*/
public void configure(Properties props){ 
	//获取配置密码 
	String password=props.getProperty(Environment.PASS); 
	//密码解 
	password=EncUtil.encToString(password); 
	//处理密码 
	props.setProperty(Environment.PASS, password); 
	//交给父类处理 
	super.configure(props); 
}

这样密码就解密重新设置了 然后交给父类来实现原有应该实现的功能呵呵!~ 处理完毕EncUtil就是我加密解密类!~ 
你们可以用自己的加密类!~ 如果在Spring里,上述方法是不行的。因为Spring直接把用户名密码给了datasource。 hibernate的属性不能生效 
下面是一种便通的方法。需要自己实现一个Configurer类

<bean id="propertyConfigurer" class="com.oa.scm.db.com.service.MyConfigurer">          
	<property name="location">              
		<value>classpath:hibernate.properties</value>          
	</property>      
</bean>

  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">              
	<property name="driverClass">
		<value>${hibernate.connection.driver_class} </value>
	</property>             
	<property name="jdbcUrl">
		<value>${hibernate.connection.url}</value>
	</property>             
	<property name="user">
		<value>${hibernate.connection.username} </value>
	</property>             
	<!-- property name="password">
		<value>${hibernate.connection.password} </value>
	</property-->             
	<property name="initialPoolSize">
		<value>${initialPoolSize}</value>
	</property>             
	<property name="minPoolSize">
		<value>${hibernate.c3p0.min_size} </value>
	</property>             
	<property name="maxPoolSize">
		<value>${hibernate.c3p0.max_size} </value>
	</property>             
	<property name="idleConnectionTestPeriod">
		<value>${hibernate.c3p0.idle_test_period} </value>
	</property>             
	<property name="acquireIncrement">
		<value>${hibernate.c3p0.acquire_increment} </value>
	</property>     
</bean> 

public class MyConfigurer extends PropertyPlaceholderConfigurer {     
@Override    
 protected void processProperties(             
	ConfigurableListableBeanFactory beanFactory, Properties props) throws BeansException {         
	System.out.println("MyConfigurer!");         
	String password = props.getProperty("hibernate.connection.password");         
	if (password != null && password.length() > 15) {             
		props.setProperty("hibernate.connection.password",
 		EncryptUtil .decrypt(password));            
 		System.out.println("MyConfigurer done!");

  	 }         
	super.processProperties(beanFactory, props);     
       }
 }

?

?

原文来源:http://www.360doc.com/content/09/1202/15/36589_10207140.shtml#?