【问题标题】:Need help configuring Grails with Oracle JDBC thin client Encryption需要帮助使用 Oracle JDBC 瘦客户端加密配置 Grails
【发布时间】:2016-05-03 17:26:59
【问题描述】:

我需要设置我们的 Grails 应用程序,将 AES 加密发送到 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 的设置器,因此您不能只将 OracleConnection 属性推入其中。

有没有人找到为 Grails 设置 Oracle 加密的方法?如果您能提供任何帮助,我将不胜感激

布赖恩

【问题讨论】:

  • 什么版本的 Grails?

标签: oracle grails encryption


【解决方案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 = truesetFastConnectionFailoverEnabled(true)

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

我查看了 Tomcat JDBC 驱动程序的源代码,想知道它是否可以/应该用作真正的 DataSource impl 并让它在 Oracle 驱动程序上调用 getConnection() 并看到它支持 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 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多