Grails Switching Config属性基于从文件加载的另一个属性



我不确定这是否可能,或者我是否必须找到另一种方法,但是...

我有一个使用弹簧安全核作为其身份验证系统的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

最新更新