Spring Security 3.0:如何指定自定义过滤器适用的URL?

时间:2010-10-17 19:39:21

标签: servlets spring-security servlet-filters

我正在使用带有JSP的Spring Security 3.0。我创建了一个RequireVerificationFilter,可以将未经验证的用户重定向到“验证您的电子邮件”页面。

我在最后一个地方将过滤器添加到spring安全过滤器堆栈中,如下所示:

我的app-config.xml中的Bean定义:

<bean id="requireVerificationFilter" class="com.ebisent.web.RequireVerificationFilter" />

过滤器已添加到security-config.xml中的spring安全过滤器列表中:

<custom-filter ref="requireVerificationFilter" after="LAST" />

过滤器有效,但会过滤自己的重定向网址。也就是说,过滤器会将未经验证的用户重定向到/ access / verify,但过滤器也会捕获该网址,过滤器会无限制地尝试重定向。

我尝试使用<filter-mapping>标记来限制此新过滤器适用的网址,但这似乎不像我想象的那样有效。这是我添加的web.xml条目:

    <filter>
        <filter-name>requireVerificationFilter</filter-name>
        <filter-class>com.ebisent.web.RequireVerificationFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>requireVerificationFilter</filter-name>
        <url-pattern>/account/*</url-pattern>
    </filter-mapping>

我在春季安全文档中阅读了“添加自己的过滤器”,但未找到答案。

我的问题是,如何指定我的过滤器适用的网址?

更新

我通过在过滤器本身中指定允许的URL来实现此目的。这对我来说很好,但如果有更好/更“弹性”的方式,我会很高兴听到它。

2 个答案:

答案 0 :(得分:4)

您应该使用org.springframework.security.web.FilterChainProxy。属性过滤器应仅包含none

<http ...>
      <custom-filter ref="requireVerificationFilterChain" after="LAST" />
</http>

<b:bean id="requireVerificationFilterChain" class="org.springframework.security.web.FilterChainProxy">
        <filter-chain-map request-matcher="ant">
            <filter-chain pattern="/account/*" filters="requireVerificationFilter"/>
        </filter-chain-map>
</b:bean>
<b:bean id="requireVerificationFilter" class="com.ebisent.web.RequireVerificationFilter" />

答案 1 :(得分:2)

您必须在实际配置xml中执行此操作(与<custom-filter ref="requireVerificationFilter" after="LAST" />相同的位置。

<http ...>
   <intercept-url pattern="/access" ... filters="..., requireVerificationFilter, ..." />
   <intercept-url pattern="/verify" ... filters="none" />
   ...
</http>

沿着这些方向,你可以指定要运行的过滤器列表,并排除那些你没有的过滤器(而“none”表示没有)。您不需要将tyour过滤器添加到web.xml - 仅与Spring Security过滤器链内联。