我需要设置我们的 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
而不是 connectionProperties
,cachingEnabled
而不是 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/