2010-09-27 111 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並將所有授權配置保存在數據庫中,然後使用外部引導程序數據定義提供不同的版本。