Spring Security 3.0.3 и пользовательский фильтр обработки аутентификации - PullRequest
1 голос
/ 10 ноября 2010

Я использую Spring Security 3.0.3.RELEASE.Я хотел бы создать собственный фильтр обработки аутентификации.

Я создал фильтр, подобный этому:

// imports ommited
public class myFilter extends AbstractAuthenticationProcessingFilter {
    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
        // some code here
    }
}

Я настраиваю security.xml следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:beans="http://www.springframework.org/schema/beans"
         xsi:schemaLocation="
         http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/security
         http://www.springframework.org/schema/security/spring-security-3.0.xsd">

    <http auto-config="true">
        <!--<session-management session-fixation-protection="none"/>-->
        <custom-filter ref="ipFilter" before="FORM_LOGIN_FILTER"/>
        <intercept-url pattern="/login.jsp*" filters="none"/>
        <intercept-url pattern="/**" access="ROLE_USER"/>
        <form-login login-page="/login.jsp" always-use-default-target="true"/>
        <logout logout-url="/logout" logout-success-url="/login.jsp" invalidate-session="true"/>
    </http>

    <beans:bean id="ipFilter" class="myFilter">
        <beans:property name="authenticationManager" ref="authenticationManager"/>
    </beans:bean>

    <authentication-manager alias="authenticationManager" />
</beans:beans>

Кажется, все правильно, но когда я пытаюсь получить доступ к защищенным страницам с myFilter.attemptAuthentication, называемым myFilter.doFilter.

Есть идеи, почему?

1 Ответ

3 голосов
/ 10 ноября 2010

Конечно, контейнер сервлета вызывает MyFilter.doFilter - в конце концов, это точка входа в фильтр.

В вашем конкретном случае предполагается, что контейнер сервлета вызывает doFilter() on AbstractAuthenticationProcessingFilter , а не MyFilter.

AbstractAuthenticationProcessingFilter.doFilter(), в свою очередь, отвечает за вызов MyFilter.attemptAuthentication().

Если это не так, возможно Вы преодолели doFilter() в MyFilter?Если да, лучше уберите это (или хотя бы позвоните super.doFilter()).См. JavaDocs AbstractAuthenticationProcessingFilter для получения дополнительной информации.

EDIT : MinimeDJ пояснил, что все так, как я предлагаю выше.В этом случае я предлагаю проверить значение filterProcessesUrl свойства.От JavaDocs :

Этот фильтр будет перехватывать запрос и пытаться выполнить аутентификацию из этого запроса , если URL-адрес запроса соответствует значению свойства filterProcessesUrl ,Это поведение можно изменить, переопределив метод requireAuthentication.

Так что вы можете:

  • либо установить соответствующее значение filterProcessesUrl (обычно что-то вроде /j_spring_security_check)
  • или вы можете переопределить метод requiresAuthentication, чтобы всегда возвращать true.

Если у вас все еще есть проблемы, тогда я предлагаю вам взять отладчик и пройти через Spring-Security (и ваш) код, чтобы увидеть, где именно возникает проблема.

...