将Acegi 集成到Web应用程序中
Acegi通过多个不同用途的Servlet过滤器截取HTTP请求实施访问安全的控制。按照传统的方式,我们应用在web.xml配置文件中通过<filter>定义Servlet过滤器并使用<filter-mapping>元素定义过滤器对应的URL 匹配模式。
代理Acegi的过滤器
下面两个配置文件Acegi 如何通过FilterChainProxy将Servlet容器 和Spring容器结合起来共同定义一个功能齐备的Servlet过滤器的。
web.xml—— Servlet容器
<filter> <filter-name>channelFilterProxy</filter-name> <filter-class> org.acegisecurity.util.FilterToBeanProxy </filter-class> <init-param> <param-name>targetClass</param-name> <param-value> org.acegisecurity.securechannel.ChannelProcessingFilter </param-value> </init-param> </filter>
applicationContext.xml—— Spring容器
<bean class=" org.acegisecurity.securechannel.ChannelProcessingFilter "> <property name="channelDecisionManager"> <ref local=” ChannelDecisionManager"> </property> <property name="filterInvocationDefinitionSource"> <ref local=” FilterInvocationDefinitionSource "> </property> </bean>
使用代理过滤器链处理HTTP请求
当需要配置多个Servlet过滤器时,虽然我们可以通过FilterToBeanProxy 分别进行配置,但这将导致冗长难看的web.xml, 同时还需要小心谨慎地通过过滤器的配置顺序保证它们的调用顺序。为了解决这个问题, Acegi 在 Acegi 8.0 中添加了一个org.acegisecurity.util.FilterChainProxy。 FilterChainProxy 可以同时指定多个过滤器并奖它们组成一个过滤器链, 而FilterToBeanProxy且只要将代理目标设置为FilterChainProxy就可以了。
web.xml中,配置如下信息
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <filter> <filter-name>AcegiFilterChainProxy</filter-name> <filter-class> org.acegisecurity.util.FilterToBeanProxy </filter-class> <init-param> <param-name>targetClass</param-name> <param-value> org.acegisecurity.util.FilterChainProxy </param-value> </init-param> </filter> <filter-mapping> <filter-name>AcegiFilterChainProxy</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
applicationContext-acegi-plugin.xml
中,配置如下信息
<beans> <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"> <property name="filterInvocationDefinitionSource"> <value> CONVERT_URL_TO_UPPERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,logoutFilter </value> </property> </bean> <bean id=”channelProcessingFilter” class=" org.acegisecurity.securechannel.ChannelProcessingFilter "> </bean> <bean id=”httpSessionContextIntegrationFilter” class=" org.acegisecurity.Context.HttpSessionContextIntegrationFilter "> </bean> </beans>
FilterChainProxy Bean 是 web.xml 的 FilterToBeanProxy 的委托目标。FilterToBeanProxy通过filterInvocationDefinitionSource定义多个相互链接的过滤器,以逗号分隔。
filterInvocationDefinitionSource 属性由两类信息组成,其一是指令信息,其二是具体的资源定义信息。指令信息定义了额外的操作规则,如
CONVERT_URL_TO_UPPERCASE_BEFORE_COMPARISON 表示判断URL匹配时,先将URL转变为大写的格式,而PATTERN_TYPE_APACHE_ANT 则表示使用Ant路径风格进行匹配URL的描述,如果不提供这个命令,Acegi使用与此同时表达式来解析URL路径映射。
注意: 链中的过滤器名很长时也不要使用回车换行,否则将导致解析错误。