外部化 Spring Security 配置?
我有一个 Web 应用程序,可以使用 Spring Security 的几种不同配置。但是,这些差异配置都是在我的 applicationContext 配置文件中设置的。因此,为了在客户站点调整这些内容,必须在 WAR 文件内修改这些内容。如果客户手动修改 WAR 文件,那么他们在重新部署新的 WAR 后将丢失所做的更改。
有没有办法外部化这个配置?有没有办法可以使用 JNDI 以某种方式加载配置?
I have a web application that works with several different configurations of Spring Security already. However, these difference configuration are all setup within my applicationContext configuration file. Therefore, in order to tweak these at a customer site, these would have to be modified INSIDE the WAR file. If customers manually modify the WAR file, then they'll lose their changes after redeploying a new WAR.
Is there a way to externalize this configuration? Is there a way I can load the configuration using JNDI somehow?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这是一个有趣的问题。由于 Spring Security 应该在根 webapp 上下文中配置,因此您无法将其配置外部化到其他上下文。此外,您无法从上下文内部更改配置资源集。因此,您应该从外部执行此操作:
您可以使用众所周知的文件系统位置:
系统属性在
contextConfigLocation
中解析,因此您可以使用它:和
-DconfigPath=...
您可以重写
XmlWebApplicationContext.getResource()
并实现您想要的任何内容:和
It's an interesting question. Since Spring Security should be configured in root webapp context, you can't externalize its configuration to other contexts. Also you can't change the set of config resources from inside the context. So, you should do it from outside:
You can use a well-known file system location:
System properties are resolved in
contextConfigLocation
, so you can use it:and
-DconfigPath=...
You can override
XmlWebApplicationContext.getResource()
and implement whatever you want:and
或者,您可以使用 org.springmodules.commons.configuration.CommonsConfigurationFactoryBean 将您的配置存储和检索为数据库表中的键、值对
Alternatively you can use org.springmodules.commons.configuration.CommonsConfigurationFactoryBean to store and retrieve your configuration as key, value pair in database table
您可以添加引用外部文件的 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer,然后在没有 Spring 配置文件的情况下使用 ${key} 语法来引用外部化属性文件中的键/值对。
另一个解决方案是在 web.xml 中指定绝对路径来引用 Spring contextConfigLocation。
You can add a org.springframework.beans.factory.config.PropertyPlaceholderConfigurer, which references an external file, then use the ${key} syntax without your Spring configuration files to reference key/value pairs in the externalized property file.
Another solution is to specify an absolute path in your web.xml to reference a Spring contextConfigLocation.
Spring 提供了几个外部化选项
Spring 配置详细信息到属性文件中,可以在外部进行管理
已部署的应用程序:
值与外部属性文件中的值。
属性文件。另外,开源Jasypt项目
提供 S pring 的属性占位符配置器和重写器的替代实现,可以从加密的属性文件中提取这些值。
可以像这样为类路径配置占位符配置器
可以像这样为文件路径配置占位符配置器
如果 db.properties 包含如下
jdbc.driverClassName=驱动程序类名称
jdbc.url=驱动程序类://localhost/applicationname/
jdbc.用户名=测试
jdbc.密码=test1
现在我们可以根据 db.properties 中的属性用占位符变量替换 Spring 配置中的硬编码值
Spring comes with a couple of options for externalizing
Spring configuration details into property files that can be managed outside of the
deployed application:
values with values from an external properties file.
properties file. In addition, the open source Jasypt project
offers alternative implementations ofS pring’s property placeholder configurer and overrider that can pull those values from encrypted properties files.
A placeholder configurer can be configured like this for classpath
A placeholder configurer can be configured like this for filepath
if db.properties contains as follows
jdbc.driverClassName=DriverclassName
jdbc.url=Driverclass://localhost/applicationname/
jdbc.username=test
jdbc.password=test1
Now we can replace the hardcoded values in the Spring configuration with place-holder variables based on the properties in db.properties
这取决于。如果要修改授权,可以使用Requestmap并将所有授权配置保存在数据库中,然后使用外部引导数据定义来交付不同的版本。
It depends. If you want modify authorizations, you can use Requestmap and save all the authorization configurations in database, then deliver different versions with external bootstrap data definitions.