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

Posted

技术标签:

【中文标题】Spring Security 3.0:如何指定应用自定义过滤器的 URL?【英文标题】:Spring Security 3.0: How do I specify URLs to which a custom filter applies? 【发布时间】:2011-04-26 16:15:51 【问题描述】:

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

我将过滤器添加到最后一个位置的弹簧安全过滤器堆栈中,如下所示:

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

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

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

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

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

我尝试使用&lt;filter-mapping&gt; 标签来限制这个新过滤器适用的 URL,但这似乎不像我想象的那样工作。这是我无论如何添加的 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>

我通读了 spring 安全文档中的“Adding in Your Own Filters”,但没有找到答案。

我的问题是,如何指定我的过滤器适用于哪些 URL?

更新:

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

【问题讨论】:

【参考方案1】:

您应该为此使用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" />

【讨论】:

【参考方案2】:

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

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

按照这些思路,您可以指定要运行的过滤器列表并排除您不运行的过滤器(“无”表示无)。您不需要将过滤器添加到 web.xml - 只需与 Spring Security 过滤器链内联。

【讨论】:

谢谢!我的安全配置中有intercept-url 标签,但我不知道你可以在那里指定过滤器。 但是Spring Security Reference Documentation 说:filters 属性“只能取值“无”。

以上是关于Spring Security 3.0:如何指定应用自定义过滤器的 URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义 Spring security 3.0 身份验证中正确处理异常?

如何知道当前的 Web 访问者是不是使用 Spring Security 3.0 登录

带有 jdbc 的 Spring Security 3.0

Spring Security 3.0 - 自定义基本 http 身份验证对话框

Grails 3.0 和 Spring Security

Spring Security SAML Extension 将 ADFS 3.0 与其他声明提供程序集成