我有一個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