hibernate使用連接池并且處理數(shù)據(jù)庫(kù)密碼加密
明文密碼太不安全使用加密吧!~
在使用 hibernate框架時(shí)怎么來(lái)處理密碼呢?
首先我們要找一個(gè)切入點(diǎn) 就是 連接池在什么時(shí)間讀的配置 這個(gè)時(shí)候我們解密在給他
看hibernate配置
<property name="hibernate.connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>
這就是hibernate把連接交給專門(mén)的連接池類(lèi)來(lái)負(fù)責(zé)
我們就在這里動(dòng)手腳
<property name="hibernate.connection.provider_class">
name.ixr.connection.C3P0ConnectionProvider
</property>
這里換成我們自己的類(lèi),當(dāng)然這個(gè)類(lèi)要有原有類(lèi)的功能
這里我們想到一個(gè)方法使用繼承
-
- 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 {
- }
- }
復(fù)制代碼
類(lèi)有了怎么處理呢? 還有原有的類(lèi)有什么方法?
需要下載 hibernate code查看 我看了他的方法 大概了解了下
知道
hibernate讀取完配置文件把配置文件對(duì)象交給了configure這個(gè)方法
然后重構(gòu)這個(gè)方法,實(shí)現(xiàn)原來(lái)的太麻煩,就算復(fù)制代碼太多我們只處理中間的一個(gè)環(huán)節(jié)所以沒(méi)有必要完全重寫(xiě),我們用多態(tài)吧,都繼承了也是為什么上邊我用繼承,看我怎么寫(xiě)的
- /**
- * 修改讀取配置文件的業(yè)務(wù)
- * 這里主要為了解密密碼
- */
- public void configure(Properties props){
- //獲取配置密碼
- String password=props.getProperty(Environment.PASS);
- //密碼解
- password=EncUtil.encToString(password);
- //處理密碼
- props.setProperty(Environment.PASS, password);
- //交給父類(lèi)處理
- super.configure(props);
- }
這樣密碼就解密重新設(shè)置了 然后交給父類(lèi)來(lái)實(shí)現(xiàn)原有應(yīng)該實(shí)現(xiàn)的功能呵呵!~
處理完畢EncUtil就是我加密解密類(lèi)!~ 你們可以用自己的加密類(lèi)!~
如果在Spring里,上述方法是不行的。因?yàn)镾pring直接把用戶名密碼給了datasource。hibernate的屬性不能生效
下面是一種便通的方法。需要自己實(shí)現(xiàn)一個(gè)Configurer類(lèi)
<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);
} }
|
|