2016-05-03 64 views
0

我需要將使用AES加密的Grails應用程序設置爲Oracle。在Java中所有的例子我已經看到你創建一個Properties對象,創建OracleDataSource並調用setProperties方法,像這樣:需要使用Oracle JDBC瘦客戶機配置Grails的幫助加密

OracleDriver dr = new OracleDriver(); 
Properties prop = new Properties(); 
prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVEL,AnoServices.ANO_REQUIRED); 
// set more 
(OracleConnection)dr.connect(url,prop); 

Grails中,連接由DataSource.groovy中,這是一個的BasicDataSource處理,所以雖然你可以用類似下面的封閉輕鬆地配置屬性:

myDatasource { 
pooled = false 
driverClassName = "oracle.jdbc.OracleDriver" 
dbCreate = "validate" // one of 'create', 'create-drop', 'update', 'validate', '' 
dialect = "org.hibernate.dialect.Oracle10gDialect" 
username = username 
password = password 
url =  url 
logSql = true 
format_sql = true 
pooled = true 
properties { 
    maxActive = 8 
    maxIdle = 4 
    minIdle = 1 
    initialSize = 1 
    minEvictableIdleTimeMillis = 60000 
    timeBetweenEvictionRunsMillis = 60000 
    maxWait = 10000 
    validationQuery = "select 1 from dual" 
    testOnBorrow=true 
    testWhileIdle=true 
    testOnReturn=true 
} 

所有在封閉的屬性對應setter方法的BasicDataSource,所以你不能只是在那裏推的的OracleConnection屬性。

有沒有人找到一種方法來爲Grails設置Oracle加密?我希望得到任何幫助,你可以給

布賴恩

+0

什麼版本的Grails? –

回答

1

數據源是從DataSource.groovy設置進行配置,但只有當不存在已經是春天配置豆,而且很容易給自己配置一個在resources.groovy

有一點需要注意的是,儘管我們使用了dataSource bean,但它是真實bean的代理(實際上是代理的代理 - 確保對getConnection()的調用返回活動事務使用的當前連接如果存在,另一個避免數據庫初始化調用(如果檢索到的池化連接在返回之前未最終用於查詢),則應該覆蓋dataSourceUnproxied bean以保留代理的優點。

我沒有訪問Oracle實例來測試這一點,但你需要它應該接近:

import oracle.jdbc.OracleConnection 
import oracle.jdbc.pool.OracleDataSource 
import oracle.net.ano.AnoServices 

beans = { 

    def props = [ 
     (OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVEL): AnoServices.ANO_REQUIRED, 
     (OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPES): '(' + AnoServices.ENCRYPTION_AES256 + ')', 
     (OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVEL): AnoServices.ANO_REQUESTED, 
     (OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPES): '(' + AnoServices.CHECKSUM_SHA1 + ')'] 

    dataSourceUnproxied(OracleDataSource) { 
     connectionProperties = props as Properties 
     implicitCachingEnabled = true 
     password = '...' 
     delegate.URL = '...' // can't use URL = '...' because of Groovy's default import of java.net.URL 
     user = '...' 
    } 
} 

根據驅動程序屬性名稱可能是不同的版本(例如properties而不是connectionProperties,​​而不是implicitCachingEnabled等),您可以根據需要設置其他屬性,對應於各種可用的設置方法,例如fastConnectionFailoverEnabled = truesetFastConnectionFailoverEnabled(true)

根據Grails的版本,配置的dataSource可能是Tomcat JDBC org.apache.tomcat.jdbc.pool.DataSource,而不是commons-dbcp BasicDataSource;更改爲for Grails 2.3,而較早的版本可以(並且應該因爲其性能明顯更好)使用jdbc-pool插件。

我看着Tomcat的JDBC驅動程序的源想知道是否可以/應作爲真正的數據源IMPL並讓它調用getConnection()對Oracle驅動程序,看到它支持connectionProperties財產,可能使這個簡單。這也許可以在支持的格式來連接加密特性,並添加到

dataSource { 
    driverClassName = 'oracle.jdbc.OracleDriver' 
    username = '...' 
    ... 
    connectionProperties = 'oracle.net.encryption_types_client=(AES256);' + 
          'oracle.net.encryption_client=REQUIRED;' + 
          'oracle.net.crypto_checksum_client=REQUESTED;' + 
          'oracle.net.crypto_checksum_types_client=(SHA1)' 
} 

退房的Tomcat JDBC Pool docs更多信息。