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

标签 oracle grails encryption

我需要设置我们的 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 的 setter ,因此您不能只将 OracleConnection 属性插入其中。

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

布赖恩

最佳答案

数据源由 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 等),您可以根据需要根据各种设置方法设置其他属性可用,例如fastConnectionFailoverEnabled = true对于 setFastConnectionFailoverEnabled(true) .

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

我查看了 Tomcat JDBC 驱动程序的来源,想知道它是否可以/应该用作真正的 DataSource 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了解更多信息。

关于oracle - 需要帮助使用 Oracle JDBC 瘦客户端加密配置 Grails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37010585/

相关文章:

java - Oracle表中如何存储特殊字符?

sql - 具有分组依据的oracle滞后函数

Grails 事务和 session

java - 在 JAVA 中构建一个 'Activation Key' 生成器

encryption - 如何使用 Yubikey 加密电子邮件?

java - 从java运行sqlplus脚本的简单方法

oracle - 来自 Unix 的执行消息 Oracle sqlplus

sql - grails/groovy 控制台 VS war 文件 模糊方法 SQL

grails - grails控制台和创建/测试类

delphi - 使用 Delphi 组件加密文件并使用其他实用程序解密