java - 外部化 Spring Security 配置?

标签 java web-applications spring-security jndi

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

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

最佳答案

这是一个有趣的问题。由于 Spring Security 应该在根 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>
    

关于java - 外部化 Spring Security 配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3805424/

相关文章:

java - 优化/并发 JAVA : reading CSV file, 解析数据以加倍然后对值进行计算

java - Spring 应用程序上下文的 Web 控制台

API 的 Spring Security 和 token 身份验证

grails - Grails Spring Security插件类的首选软件包

java - arraylist 可以用返回 arraylist 的方法初始化吗?

java - 如何以编程方式获取部署地址?

java - 如何在 Java 中更快地计算 sha256?

javascript - 我使用 agoraIO web app sdk 创建了应用程序但无法加入视频通话

iphone - 媒体查询在 Android 浏览器上失败

spring-security - 基于Spring Security 3.2代码的配置。表单登录+全局方法安全性