试图为Spring的FilterChainProxy提供替代实现

时间:2011-12-13 13:44:22

标签: spring spring-security

我正在使用Spring安全性开发应用程序 该应用程序是可扩展的,我想阻止扩展以编程方式更改Spring FilterChainProxy的过滤器链映射中的过滤器。我打算做的是:

  1. 实现CustomFilterChainProxy实现所有FilterChainProxy实现的接口(Filter,InitializingBean,ApplicationContextAware)。在其中,我将拥有一个私有FilterChainProxy成员并委托所有接口调用。

  2. 通过在DelegatingFilterProxy文件中声明来使用Spring的web.xml

    <filter>
        <filter-name>customSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    
  3. 在Spring配置文件中,不是直接使用Spring的FilterChainProxy,而是让我的bean将CustomFilterChainProxy作为其类,如下所示:

    <bean id="customSecurityFilterChain" class="....CustomFilterChainProxy">
        <security:filter-chain-map ...>
            <security:filter-chain pattern="..." filters="..." />
            <security:filter-chain pattern="..." filters="..." />
            ...
        </security:filter-chain-map>
    </bean>
    
  4. 为了能够在Spring bean加载期间设置过滤器链图,我必须在我的CustomFilterChainProxy类中提供一个setter。我会做的。并且为了防止在Spring bean加载后设置过滤器链映射,我将确保在bean构造之后(在@PostConstruct方法中)将从该setter抛出异常。

  5. 通过CustomFilterChainProxy代替FilterChainProxy,我是否导致任何Spring进程出现故障?

    我看到引用FilterChainProxy对象本身的唯一Spring类是FilterChainProxyPostProcessor但是无法确定这是否会影响我的实现选择。有什么输入吗?

    非常感谢。

1 个答案:

答案 0 :(得分:3)

这不足以保护您免受恶意扩展代码的侵害。

如果扩展程序可以访问您的bean,那么它也可以通过FilterChainProxy访问原始ApplicationContext。事实上,它可能会访问相同配置中的任何其他bean,因此可能会:

  • 加载用户帐户数据,包括密码
  • 修改或读取其他bean上的设置以破坏系统
  • 使用反射直接读取实例字段
  • 修改当前安全上下文
  • 很多其他令人讨厌的东西取决于你正在使用的东西

如果你的应用程序中有不受信任的代码,那么你需要使用SecurityManager来防止这类事情,然后你也可以阻止访问Spring Security类。配置SecurityManager可能很麻烦,但如果你有不信任的代码在同一个虚拟机中运行,它可能是唯一的选择。

更新:如果您唯一担心的是阻止任何人调用setFilterChainMap方法,那么重写此方法显然会阻止任何人通过对您的bean的引用意外调用此方法(此方法是实际上在3.1中不赞成使用构造函数。但是,从你的问题中不清楚为什么有人会获得对你的实例的引用而不是原始的bean,或者为什么这是你的主要关注。FilterChainProxy通常不是由应用程序中的用户代码访问。为此,您必须从bean工厂明确请求它。