Spring Security 3 自定义过滤器和 URL 模式

Posted

技术标签:

【中文标题】Spring Security 3 自定义过滤器和 URL 模式【英文标题】:Spring Security 3 Custom Filter and URL Patterns 【发布时间】:2016-04-26 17:24:40 【问题描述】:

我已经配置了一个扩展 AbstractPreAuthenticatedProcessingFilter 的自定义 Pre Auth 过滤器。

据我了解,我可以指定哪些 URL 模式使用此过滤器,并指定我不想使用任何过滤器或安全性的任何 URL。

我正在使用 Spring Security 3.2 和 XML 配置,因此我认为这样的东西应该可以工作。

<security:http pattern="/login" use-expressions="true" security="none">
    </security:http>


<security:http pattern="/home" use-expressions="true" auto-config="true"
        entry-point-ref="http403EntryPoint">
        <security:custom-filter position="PRE_AUTH_FILTER"
            ref="openTokenFilter" />
        <security:session-management
            invalid-session-url="/login" />
        <security:session-management>
            <security:concurrency-control
                max-sessions="1" error-if-maximum-exceeded="true" />
        </security:session-management>
        <security:access-denied-handler error-page="/login"/> 
        <security:logout delete-cookies="JSESSIONID"/>
    </security:http>

通过为pattern="/login" 指定security="none",我认为这不会在访问“localhost:8080/login”时调用过滤器。但是,它仍然在调用过滤器。

过滤器似乎有一些全局设置,每个请求都会调用它。我使用的是 Spring Boot,所以我没有 web.xml 文件或任何自定义 servlet 配置。

基本上,我希望过滤器适用于除“/login”之外的每个 URL。

【问题讨论】:

您的登录页面有扩展名吗?在这种情况下使用模式 /login* 这只是一个简单的html文件,我试过了,但不幸的是没有任何作用。 【参考方案1】:

以下句子引用自spring doc:

要使用表达式来保护各个 URL,您首先需要 将&lt;http&gt; 元素中的use-expressions 属性设置为true。 Spring Security 将期望&lt;intercept-url&gt; 元素的访问 属性包含Spring EL 表达式。这 表达式应计算为布尔值,定义是否访问 是否允许

所以你应该删除 use-expressions="true" 并使用 pattern="/login*"。

【讨论】:

以上是关于Spring Security 3 自定义过滤器和 URL 模式的主要内容,如果未能解决你的问题,请参考以下文章

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

Spring Security 自定义过滤器

Spring Security 自定义身份验证过滤器和授权

必须指定 Spring Security authenticationmanager - 用于自定义过滤器

JSF / Spring Security - 添加其他登录字段不会调用自定义过滤器

将@Component 添加到自定义 Spring Security 过滤器的含义是啥