0

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

我有一个使用 Spring-Security-Core 作为其身份验证系统的 Grails 应用程序。最终可能会在几个位置部署它,并且不同的位置可能会使用不同的身份验证提供程序(例如,有些将使用 DAO,有些将使用 LDAP 等)

我希望能够根据 .properties 文件“auth.type=LDAP”或“auth.type=DAO”中的一行来设置应用程序。一旦应用程序知道它将是两者中的哪一个,它就需要使用 Config.groovy 设置进一步的属性来满足这一点。

我正在考虑需要 config.groovy 从 .properties 文件加载属性,然后在 Config.groovy 中在 switch 语句中使用这些属性来确定要设置哪些其他属性。但是我尝试了这个,但我相信在配置文件中,来自 .properties 文件的属性是在配置文件中的所有属性之后加载的。这是一个正确的假设吗?

无论如何,如果有人知道实现这种效果的简单方法,将不胜感激

4

1 回答 1

1

您是正确的,从grails.config.locations文件(groovy 或属性)读取的属性仅在读取主文件后才应用Config.groovy。您可以使用自定义环境,并拥有类似的东西

environments {
  ldapAuth {
    foo.bar = 'something'
  }
  daoAuth {
    foo.bar = 'something else'
  }
}

但是您必须在构建 WAR 时指定环境,您不能构建一个 WAR,然后在运行时将其配置为不同的环境。

如果您有某种方法可以为运行 WAR 的 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变量(我不知道,我没有尝试过)。但是,在该闭包中,您可以访问完整的配置config,因此,只要您有auth.type = authType我在上面使用的行,您就可以config.auth.type改为说。

于 2012-10-31T10:48:20.537 回答