外部化Spring Security配置?

时间:2010-09-27 15:41:43

标签: java web-applications spring-security jndi

我有一个Web应用程序,它已经与Spring Security的几种不同配置一起使用。但是,这些差异配置都在我的applicationContext配置文件中设置。因此,为了在客户站点调整这些,必须在WAR文件中修改这些。如果客户手动修改WAR文件,那么在重新部署新WAR后,他们将丢失更改。

有没有办法外化此配置?有没有办法我可以用某种方式使用JNDI加载配置?

6 个答案:

答案 0 :(得分:4)

这是一个有趣的问题。由于Spring Security应该在root webapp上下文中配置,因此您无法将其配置外部化到其他上下文。此外,您无法从上下文中更改配置资源集。所以,你应该从外面做:

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

     <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>
    

答案 1 :(得分: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> 

答案 2 :(得分: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>

答案 3 :(得分:0)

这是一个免费的配置工具:http://go.eeye.com/icwt,用于测试您的环境以获得强烈推荐的配置更新,如何配置本地操作系统(识别潜在的问题区域),识别有关APT的区域,并显示您的进程和代码签了。

答案 4 :(得分:0)

Spring提供了几种外部化选项 Spring配置详细信息到可以在。之外管理的属性文件中 部署的应用程序:

  1. 属性占位符配置器替换放置在属性中的占位符变量 值与外部属性文件中的值。
  2. 属性覆盖器使用外部值覆盖bean属性值 属性文件。另外,开源Jasypt项目 提供了pring的属性占位符配置器和覆盖器的替代实现,可以从加密的属性文件中提取这些值。 可以为类路径配置占位符配置器 可以为文件路径配置占位符配置器   如果db.properties包含如下内容 jdbc.driverClassName = DriverclassName jdbc.url = Driverclass://本地主机/的applicationName / jdbc.username =测试 jdbc.password = TEST1 现在我们可以根据db.properties中的属性替换Spring配置中的硬编码值和占位符变量

答案 5 :(得分:0)

这取决于。如果要修改授权,可以使用Requestmap并将所有授权配置保存在数据库中,然后使用外部引导数据定义提供不同的版本。