我有一个 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/