我不确定这是否可能,或者我是否必须找到另一种方法,但是...
我有一个使用弹簧安全核作为其身份验证系统的Grails应用程序。在几个位置可以最终部署它,并且不同的位置可能会使用不同的身份验证提供商(例如,有些将使用DAO,有些使用LDAP等)
)我希望能够基于.properties文件'auth.type = ldap'或'auth.type = dao'中的一行设置该应用程序。一旦应用程序知道两者中的哪一个将需要使用config.groovy设置更多的属性,以便为此迎合它。
我正在沿着需要config.groovy的方式进行思考,以加载.properties文件,然后在config.groovy中使用Switch语句中的这些属性来确定要设置哪些其他属性。但是我尝试了一下,但是我相信在配置文件中,在配置文件中的所有属性之后,都加载了来自.properties文件的属性。这是正确的假设吗?
无论如何,如果有人知道一种实现这种影响的简单方法,将非常感激
您是正确的,只有在读取主Config.groovy
之后才应用grails.config.locations
文件(Groovy或属性)读取的属性。您可以使用自定义环境,并有
environments {
ldapAuth {
foo.bar = 'something'
}
daoAuth {
foo.bar = 'something else'
}
}
但是,您必须在建造战争时指定环境,不能在运行时为其他环境进行配置。
如果您有某种方式将系统属性指定为tomcat(或任何正在运行战争的),那么您可以做
之类的事情def authType = System.getProperty('myapp.auth.type', 'dao')
// store authType as a real config option as well as a local variable
auth.type = authType
switch(authType) {
case 'dao':
foo {
bar = 'something'
}
break
case 'ldap':
foo {
bar = 'something else'
}
break
default:
println "Unrecognised auth type ${authType}"
}
或手动阅读.properties
文件(而不是依赖grails.config.locations
)
def authProps = new Properties()
new File('/etc/myapp/auth.properties').withInputStream(authProps.&load)
def authType = authProps.getProperty('auth.type', 'dao')
auth.type = authType
// switch(authType) as before
一个皱纹 - 在log4j
闭合中,您可能会发现自己无法访问authProps
变量(我不知道,我没有尝试过)。但是,在此关闭中,您 can 访问config
的完整配置,因此,只要您使用了我上面使用的auth.type = authType
行,您就可以说config.auth.type
。