外部化 Spring Security 配置?

发布于 2024-09-24 19:03:48 字数 217 浏览 4 评论 0原文

我有一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

自我难过 2024-10-01 19:03:48

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

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

     <上下文参数>
         <参数名称>contextConfigLocation
         <参数值>
             /WEB-INF/applicationContext.xml
             文件:///C:\config.xml
         
     
    
  • 系统属性在contextConfigLocation中解析,因此您可以使用它:

     <上下文参数>
         <参数名称>contextConfigLocation
         <参数值>
             /WEB-INF/applicationContext.xml
             文件:///${configPath}
         
     
    

    -DconfigPath=...

  • 您可以重写 XmlWebApplicationContext.getResource() 并实现您想要的任何内容:

    public class MyXmlWebApplicationContext 扩展 XmlWebApplicationContext {
        私有静态最终字符串 JNDI_PREFIX = "jndi:/";        
        @覆盖
        公共资源 getResource(字符串位置) {
            if (location.startsWith(JNDI_PREFIX)) 返回 getJndiResource(location);
            否则返回 super.getResource(location);
        }
        受保护的资源 getJndiResource(String location) { ... }
    }
    

    <上下文参数>
        <参数名称>contextConfigLocation
        <参数值>
            /WEB-INF/applicationContext.xml
            杰恩迪:/...
        
            
    <上下文参数>
        <参数名称>contextClass
        <参数值>com.example.MyXmlWebApplicationContext
    
    

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:

     <context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>
             /WEB-INF/applicationContext.xml
             file:///C:\config.xml
         </param-value>
     </context-param>
    
  • System properties are resolved in contextConfigLocation, so you can use it:

     <context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>
             /WEB-INF/applicationContext.xml
             file:///${configPath}
         </param-value>
     </context-param>
    

    and -DconfigPath=...

  • You can override XmlWebApplicationContext.getResource() and implement whatever you want:

    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) { ... }
    }
    

    and

    <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>
    
我ぃ本無心為│何有愛 2024-10-01 19:03:48

或者,您可以使用 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>

Alternatively you can use org.springmodules.commons.configuration.CommonsConfigurationFactoryBean to store and retrieve your configuration as key, value pair in database table

    <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>
旧时模样 2024-10-01 19:03:48

您可以添加引用外部文件的 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer,然后在没有 Spring 配置文件的情况下使用 ${key} 语法来引用外部化属性文件中的键/值对。

另一个解决方案是在 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> 

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.

<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/absolute_path/ldap.xml, /WEB-INF/context/dao-context.xml</param-value>
</context-param> 
感情旳空白 2024-10-01 19:03:48

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

  1. 属性占位符配置器替换属性中放置的占位符变量
    值与外部属性文件中的值。
  2. 属性重写器使用来自外部的值重写 bean 属性值
    属性文件。另外,开源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:

  1. Property placeholder configurers replace placeholder variables placed in property
    values with values from an external properties file.
  2. Property overriders override bean property values with values from an external
    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

抱猫软卧 2024-10-01 19:03:48

这取决于。如果要修改授权,可以使用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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文