2010-09-27 112 views
2

我有一个web应用程序,可以与Spring Security的几种不同配置一起工作。但是,这些差异配置都是在我的applicationContext配置文件中设置的。因此,为了在客户站点调整这些内容,必须在WAR文件中修改这些内容。如果客户手动修改WAR文件,那么他们将在重新部署新的WAR之后失去其更改。外部化Spring安全配置?

有没有一种方法来外化这种配置?有没有办法使用JNDI以某种方式加载配置?

回答

0

您可以添加引用外部文件的org.springframework.beans.factory.config.PropertyPlaceholderConfigurer,然后使用$ {key}语法,而无需Spring配置文件引用外部化属性文件中的键/值对。

另一种解决方案是在web.xml中指定一个绝对路径来引用Spring contextConfigLocation。

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/absolute_path/ldap.xml, /WEB-INF/context/dao-context.xml</param-value> 
</context-param> 
+0

我对这种功能很熟悉,但我认为我不能用它将LDAP服务器身份验证提供程序添加到身份验证提供程序列表中,例如。 – HDave 2010-09-27 15:56:10

+1

您不能使用此机制来配置提供程序。另一种方法是创建一个外部化的安全上下文XML文件。您可以参考Spring之外的战争文件。 – BacMan 2010-09-27 16:16:23

+0

Bacman - 这听起来很有趣 - 你能否提供关于如何引用外部化上下文XML文件的提示? – HDave 2010-09-27 19:44:52

0

或者您可以使用org.springmodules.commons.configuration.CommonsConfigurationFactoryBean来配置存储和检索为重点,在数据库表中的值对

<bean name="DatabaseConfiguration" class="org.apache.commons.configuration.DatabaseConfiguration"> 
      <constructor-arg type="javax.sql.DataSource" ref="dataSource"/> 
      <constructor-arg index="1" value="CONFIG_TABLE_NAME"/> 
      <constructor-arg index="2" value="KEY_COLUMN_NAME"/> 
      <constructor-arg index="3" value="VALUE_COLUMN_NAME"/> 
    </bean> 
+1

这里是完整的配置 – KZameer 2010-09-27 16:37:31

4

这是一个有趣题。由于Spring Security应该在根web应用上下文中进行配置,因此不能将其配置外部化为其他上下文。您也无法从上下文中更改配置资源集。所以,你应该从外面做:

  • 您可以使用一个众所周知的文件系统位置:

    <context-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value> 
         /WEB-INF/applicationContext.xml 
         file:///C:\config.xml 
        </param-value> 
    </context-param> 
    
  • 系统属性在contextConfigLocation解决,所以你可以使用它:

    <context-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value> 
         /WEB-INF/applicationContext.xml 
         file:///${configPath} 
        </param-value> 
    </context-param> 
    

    -DconfigPath=...

  • 您可以覆盖XmlWebApplicationContext.getResource()和执行任何你想要的:

    public class MyXmlWebApplicationContext extends XmlWebApplicationContext { 
        private static final String JNDI_PREFIX = "jndi:/";   
        @Override 
        public Resource getResource(String location) { 
         if (location.startsWith(JNDI_PREFIX)) return getJndiResource(location); 
         else return super.getResource(location); 
        } 
        protected Resource getJndiResource(String location) { ... } 
    } 
    

    <context-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value> 
         /WEB-INF/applicationContext.xml 
         jndi:/... 
        </param-value> 
    </context-param>   
    <context-param> 
        <param-name>contextClass</param-name> 
        <param-value>com.example.MyXmlWebApplicationContext</param-value> 
    </context-param> 
    
+0

如果我要去JNDI路线,我想我将不得不以编程方式配置弹簧安全,是吗? – HDave 2010-09-28 03:58:47

+0

顺便说一句 - 我很关心在文件系统上打开文件的想法。我不确定某些客户是否会在JEE环境中允许这样做,并且我也不确定这将如何与群集相互作用。 – HDave 2010-09-28 04:15:34

+0

@HDave:不,第三种方法显示了如何创建自己的方式来访问XML配置(以及其他“资源”)。 – axtavt 2010-09-28 12:09:37

0

这是一个免费的配置工具:http://go.eeye.com/icwt,测试你的环境,强烈建议配置更新,如何在本地操作系统已配置(识别潜在问题区域),确定与APT有关的区域,并显示您的流程和代码是否已签名。

0

Spring提供了几个选项来外部 Spring配置信息转换成可以在 部署的应用程序之外管理属性文件:

  1. 物业占位configurers代替放置在财产 值与值占位符变量来自外部属性文件。
  2. 属性重写器使用来自外部 属性文件的值覆盖bean属性值。另外,开源的Jasypt项目 提供了S pring的属性占位符配置器和覆盖器的替代实现,可以从加密属性文件中提取这些值。 占位符配置器可以被配置成这样的用于类路径 占位符配置器可以被配置成这样的用于文件路径 如果db.properties包含如下 jdbc.driverClassName = DriverclassName jdbc.url = Driverclass://本地主机/的applicationName/ jdbc.username =测试 jdbc.password = test1的 现在我们可以在db.properties
0

这取决于基于属性的占位符代替变量在Spring配置中的硬编码值。如果您想修改授权,则可以使用Requestmap并将所有授权配置保存在数据库中,然后使用外部引导程序数据定义提供不同的版本。