Spring Security 3.0: как указать URL-адреса, к которым применяется пользовательский фильтр? - PullRequest
5 голосов
/ 17 октября 2010

Я использую Spring Security 3.0 с JSP.Я создал RequireVerificationFilter, который перенаправляет непроверенных пользователей на страницу «подтвердить свою электронную почту».

Я добавил фильтр в стек фильтра безопасности Spring в последнем месте, например:

Определение компонента в моемapp-config.xml:

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

Фильтр добавлен в список фильтров безопасности Spring в моем файле security-config.xml:

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

Фильтр работает, но он фильтрует свой собственный URL-адрес перенаправления,То есть фильтр перенаправляет непроверенных пользователей в / access / verify, но этот URL также перехватывается фильтром, который пытается перенаправить до бесконечности.

Я пытался использовать тег <filter-mapping>, чтобы ограничить 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>

Я прочитал «Добавление своих фильтров» в весенней документации по безопасности, но не нашел ответа.

МойВопрос в том, как мне указать, к каким URL-адресам применяется мой фильтр?

ОБНОВЛЕНИЕ:

Я получил эту работу, указав URL-адрес, разрешенный внутри самого фильтра.Это прекрасно работает для меня, но если есть лучший / более "упругий" способ сделать это, я был бы рад услышать это.

Ответы [ 2 ]

4 голосов
/ 15 декабря 2014

Вы должны использовать 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 голосов
/ 18 октября 2010

Вы должны сделать это внутри фактической xml конфигурации (там же, где у вас есть <custom-filter ref="requireVerificationFilter" after="LAST" />.

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

. Что-то в этом духе, вы можете указать список фильтров, которые вы хотите запустить, иисключите те, которые вы не делаете (а «нет» означает «нет»). Вам не нужно добавлять фильтр tyour в файл web.xml - только встроенный в цепочку фильтров Spring Security.

...