我需要使用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加密的方法?我很感激你能给予的任何帮助
布赖恩
答案 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
而不是connectionProperties
,cachingEnabled
而不是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了解详情。