我正在使用Spring安全性开发应用程序
该应用程序是可扩展的,我想阻止扩展以编程方式更改Spring FilterChainProxy
的过滤器链映射中的过滤器。我打算做的是:
实现CustomFilterChainProxy
实现所有FilterChainProxy
实现的接口(Filter,InitializingBean,ApplicationContextAware)。在其中,我将拥有一个私有FilterChainProxy
成员并委托所有接口调用。
通过在DelegatingFilterProxy
文件中声明来使用Spring的web.xml
:
<filter>
<filter-name>customSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
在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>
为了能够在Spring bean加载期间设置过滤器链图,我必须在我的CustomFilterChainProxy
类中提供一个setter。我会做的。并且为了防止在Spring bean加载后设置过滤器链映射,我将确保在bean构造之后(在@PostConstruct
方法中)将从该setter抛出异常。
通过CustomFilterChainProxy
代替FilterChainProxy
,我是否导致任何Spring进程出现故障?
我看到引用FilterChainProxy
对象本身的唯一Spring类是FilterChainProxyPostProcessor
但是无法确定这是否会影响我的实现选择。有什么输入吗?
非常感谢。
答案 0 :(得分:3)
这不足以保护您免受恶意扩展代码的侵害。
如果扩展程序可以访问您的bean,那么它也可以通过FilterChainProxy
访问原始ApplicationContext
。事实上,它可能会访问相同配置中的任何其他bean,因此可能会:
如果你的应用程序中有不受信任的代码,那么你需要使用SecurityManager
来防止这类事情,然后你也可以阻止访问Spring Security类。配置SecurityManager
可能很麻烦,但如果你有不信任的代码在同一个虚拟机中运行,它可能是唯一的选择。
更新:如果您唯一担心的是阻止任何人调用setFilterChainMap
方法,那么重写此方法显然会阻止任何人通过对您的bean的引用意外调用此方法(此方法是实际上在3.1中不赞成使用构造函数。但是,从你的问题中不清楚为什么有人会获得对你的实例的引用而不是原始的bean,或者为什么这是你的主要关注。FilterChainProxy
通常不是由应用程序中的用户代码访问。为此,您必须从bean工厂明确请求它。