繁体   English   中英

外部化Spring Security配置?

[英]Externalizing Spring Security configuration?

我有一个已经可以与Spring Security的几种不同配置一起使用的Web应用程序。 但是,这些差异配置都是在我的applicationContext配置文件中设置的。 因此,为了在客户现场进行调整,必须在WAR文件中对其进行修改。 如果客户手动修改WAR文件,则在重新部署新的WAR之后,他们将丢失所做的更改。

有没有办法外部化此配置? 有什么办法可以使用JNDI加载配置吗?

这是一个有趣的问题。 由于应该在根webapp上下文中配置Spring Security,因此您不能将其配置外部化到其他上下文中。 同样,您不能从上下文内部更改配置资源集。 因此,您应该从外部进行操作:

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

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

Spring提供了两个选项,用于将Spring配置详细信息外部化为可以在已部署应用程序外部进行管理的属性文件:

  1. 属性占位符配置程序用外部属性文件中的值替换放置在属性值中的占位符变量。
  2. 属性替代器使用外部属性文件中的值覆盖Bean属性值。 另外,开源Jasypt项目提供了S pring的属性占位符配置器和替代器的替代实现,可以从加密的属性文件中提取这些值。 可以像这样为类路径配置一个占位符配置器如果db.properties包含以下内容,则可以像这样为文件路径配置一个占位符配置器:jdbc.driverClassName = DriverclassName jdbc.url = Driverclass:// localhost / applicationname / jdbc.username = test jdbc .password = test1现在,我们可以基于db.properties中的属性,用占位符变量替换Spring配置中的硬编码值

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

您可以添加一个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>

这是一个免费的配置工具: http : //go.eeye.com/icwt ,它可以测试您的环境以获取强烈推荐的配置更新,配置本地OS的方式(标识潜在的问题区域),标识与APT有关的区域,并显示是否流程和代码已签名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM