2011-12-13 58 views
0

我正在使用Spring安全性的应用程序。
该应用程序是可扩展的,我想阻止扩展程序更改Spring的FilterChainProxy的过滤器链图中的过滤器。我打算做的是以下几点:试图为Spring的FilterChainProxy提供另一种实现方式

  1. 实现一个CustomFilterChainProxy实现所有的FilterChainProxy的实现的接口(过滤器,的InitializingBean,了ApplicationContextAware)。其中我将持有私人FilterChainProxy成员并将所有接口调用委托给它。

  2. 使用Spring通过宣布在web.xml文件的DelegatingFilterProxy

    <filter> 
        <filter-name>customSecurityFilterChain</filter-name> 
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    
  3. 在Spring配置文件,而不是使用Spring的FilterChainProxy直接我有我的豆有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的加载过程中过滤器链地图,我必须在我的0供应二传手类。我会做。为了防止在Spring bean加载后设置过滤器链映射,我将确保在bean构建之后(在@PostConstruct方法中)将从该设置器抛出异常。

由于具有CustomFilterChainProxy,而不是一个FilterChainProxy,我是不是造成任何春天过程发生故障?

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

非常感谢。

回答

3

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

如果扩展程序可以访问您的bean,那么它也可以通过ApplicationContext访问原始的FilterChainProxy。事实上,它也许可以在相同的配置访问其它bean,所以它可能潜在:

  • 加载用户帐户数据,包括密码
  • 修改或阅读其他豆类设置打破系统
  • 使用反射来读取实例字段直接
  • 修改当前的安全上下文
  • 很多依赖于其他令人讨厌的事情,你正在使用
什么

如果您的应用程序中存在不可信的代码,那么您需要使用SecurityManager来防止这种情况,并且您还可以阻止访问Spring Security类。配置SecurityManager会很痛苦,但如果你有不信任的代码在同一个虚拟机上运行,​​那么这可能是唯一的选择。

更新:如果你唯一担心的是阻止任何人调用setFilterChainMap方法,然后重写此方法显然会防止任何人通过参考偶然打电话给你的豆(这种方法有利于一个真正弃用3.1但是,从你的问题中不清楚为什么有人会获得对你的实例的引用而不是原来的bean,或者为什么这是你最关心的问题,FilterChainProxy通常不会被应用程序中的用户代码访问,为此,你必须明确地从豆厂请求它。

+0

+1。试图通过这种类型的代码隐藏来防止用法不会阻止真正的m但是它会让所有使用你的框架的人感到沮丧,因为你故意绕过(已建立的)API。 – pap

+0

@ user1095833我想你的帖子中使用Spring Security的方式并不十分清楚。你是在代码中建立一切还是使用ApplicationContext?通常访问FilterChainProxy的唯一方法是通过显式从ApplicationContext获取bean。或者你有一个使用涉及到使用FilterChainProxy的引用的扩展? –

+0

是的,我唯一担心的是阻止调用setFilterChainMap - 这是因为我们发现扩展代码直接访问bean并使用此setter。更新了问题以显示Spring的配置文件。它配置一个CustomFilterChainProxy而不是FilterChainProxy,所以引用该bean将返回一个CustomFilterChainProxy。 – Jim

相关问题