我有一个web应用程序,可以与Spring Security的几种不同配置一起工作。但是,这些差异配置都是在我的applicationContext配置文件中设置的。因此,为了在客户站点调整这些内容,必须在WAR文件中修改这些内容。如果客户手动修改WAR文件,那么他们将在重新部署新的WAR之后失去其更改。外部化Spring安全配置?
有没有一种方法来外化这种配置?有没有办法使用JNDI以某种方式加载配置?
我有一个web应用程序,可以与Spring Security的几种不同配置一起工作。但是,这些差异配置都是在我的applicationContext配置文件中设置的。因此,为了在客户站点调整这些内容,必须在WAR文件中修改这些内容。如果客户手动修改WAR文件,那么他们将在重新部署新的WAR之后失去其更改。外部化Spring安全配置?
有没有一种方法来外化这种配置?有没有办法使用JNDI以某种方式加载配置?
您可以添加引用外部文件的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>
或者您可以使用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>
这里是完整的配置 – KZameer 2010-09-27 16:37:31
这是一个有趣题。由于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>
这是一个免费的配置工具:http://go.eeye.com/icwt,测试你的环境,强烈建议配置更新,如何在本地操作系统已配置(识别潜在问题区域),确定与APT有关的区域,并显示您的流程和代码是否已签名。
Spring提供了几个选项来外部 Spring配置信息转换成可以在 部署的应用程序之外管理属性文件:
这取决于基于属性的占位符代替变量在Spring配置中的硬编码值。如果您想修改授权,则可以使用Requestmap并将所有授权配置保存在数据库中,然后使用外部引导程序数据定义提供不同的版本。
我对这种功能很熟悉,但我认为我不能用它将LDAP服务器身份验证提供程序添加到身份验证提供程序列表中,例如。 – HDave 2010-09-27 15:56:10
您不能使用此机制来配置提供程序。另一种方法是创建一个外部化的安全上下文XML文件。您可以参考Spring之外的战争文件。 – BacMan 2010-09-27 16:16:23
Bacman - 这听起来很有趣 - 你能否提供关于如何引用外部化上下文XML文件的提示? – HDave 2010-09-27 19:44:52