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

Я использую 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-адрес, который можно разрешить в самом фильтре. Это отлично работает для меня, но если есть лучший/более "упругий" способ сделать это, я был бы рад это услышать.


person outis    schedule 17.10.2010    source источник


Ответы (2)


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

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

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

person Gandalf    schedule 18.10.2010
comment
Спасибо! У меня есть теги перехвата URL-адреса в моей конфигурации безопасности, но я не знал, что там можно указать фильтры. - person outis; 18.10.2010
comment
Но Справочная документация Spring Security говорит, что: filters атрибут Может принимать только значение «none». - person btpka3; 10.07.2013

Вы должны использовать 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" />
person Michel    schedule 15.12.2014