需要帮助使用Oracle JDBC瘦客户端加密配置Grails

时间:2016-05-03 17:27:00

标签: oracle grails encryption

我需要使用AES加密设置我们的Grails应用程序到Oracle。在我看到的所有Java示例中,您都创建了一个Properties对象,创建了一个OracleDataSource并调用了setProperties,如下所示:

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
}

该闭包中的所有属性都对应于BasicDataSource的setter,因此您无法在那里推送OracleConnection属性。

有没有人找到为Grails设置Oracle加密的方法?我很感激你能给予的任何帮助

布赖恩

1 个答案:

答案 0 :(得分:1)

数据源是根据DataSource.groovy中的设置配置的,但仅限于尚未配置Spring bean的情况下,并且您可以在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而不是connectionPropertiescachingEnabled而不是implicitCachingEnabled等等,您可以根据需要设置对应于可用的各种setter方法的附加属性,例如fastConnectionFailoverEnabled = true的{​​{1}}。

根据Grails的版本,配置的setFastConnectionFailoverEnabled(true)可能是Tomcat JDBC dataSource而不是commons-dbcp org.apache.tomcat.jdbc.pool.DataSource;更改已for Grails 2.3,早期版本可以(并且应该因为其明显更好的性能)使用jdbc-pool插件。

我查看了Tomcat JDBC驱动程序的来源,想知道它是否可以/应该用作真正的DataSource impl并让它在Oracle驱动程序上调用BasicDataSource并看到它支持getConnection()可能使这更简单的财产。可以以受支持的格式连接加密属性并将其添加到

connectionProperties

查看Tomcat JDBC Pool docs了解详情。