2015-05-22 4 views
0

Мне нужно определить настраиваемый RememberMeAuthenticationFilter, чтобы я мог переопределить метод onSuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authResult), чтобы поместить некоторую пользовательскую логику.Spring Безопасность и пользовательские настройки Запомнить меня фильтр: logout issue

Я настроил XML для того, чтобы использовать свой собственный фильтр:

<security:http disable-url-rewriting="true" request-matcher-ref="excludeUrlRequestMatcher" entry-point-ref="authenticationEntryPoint"> 
    <security:custom-filter position="FORM_LOGIN_FILTER" ref="usernamePasswordAuthenticationFilter"/> 
    <security:custom-filter position="REMEMBER_ME_FILTER" ref="extRememberMeProcessingFilter"/> 

    <security:anonymous username="anonymous" granted-authority="ROLE_ANONYMOUS"/> 

    <security:session-management session-authentication-strategy-ref="fixation" /> 

    <!-- Intercepts url HERE: removed for brevity --> 

    <!--<security:form-login: using custom filter --> 
      <!--login-page="/login"--> 
      <!--authentication-failure-handler-ref="loginAuthenticationFailureHandler"--> 
      <!--authentication-success-handler-ref="loginGuidAuthenticationSuccessHandler"/>--> 


    <security:logout logout-url="/logout" success-handler-ref="logoutSuccessHandler"/> 

    <security:port-mappings> 
     <security:port-mapping http="#{configurationService.configuration.getProperty('tomcat.http.port')}" 
           https="#{configurationService.configuration.getProperty('tomcat.ssl.port')}"/> 
     <security:port-mapping http="80" https="443"/> 
     <!--security:port-mapping http="#{configurationService.configuration.getProperty('proxy.http.port')}" 
      https="#{configurationService.configuration.getProperty('proxy.ssl.port')}" /--> 
    </security:port-mappings> 

    <security:request-cache ref="httpSessionRequestCache"/> 

    <security:access-denied-handler ref="b2bAccessDeniedHandler"/> 

    <!-- RememberMe: using custom filter --> 
    <!--<security:remember-me key="comtestrememberme" services-ref="rememberMeServices"/>--> 

</security:http> 

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider ref="myAuthenticationProvider"/> 
    <security:authentication-provider ref="rememberMeAuthenticationProvider"/> 
</security:authentication-manager> 

<bean id="myAuthenticationProvider" 
     class="com.test.security.MyAuthenticationProvider"> 
    <property name="bruteForceAttackCounter" ref="bruteForceAttackCounter"/> 
    <property name="customerService" ref="customerService"/> 
    <aop:scoped-proxy/> 
</bean> 

<bean id="rememberMeServices" 
     class="com.test.security.MyRememberMeServices"> 
    <property name="key" value="comtestrememberme"/> 
    <property name="cookieName" value="myRememberMe"/> 
    <property name="alwaysRemember" value="false"/> 
    <property name="customerService" ref="customerService"/> 
    <property name="useSecureCookie" value="false"/> 
    <aop:scoped-proxy/> 
</bean> 

<bean id="rememberMeAuthenticationProvider" 
     class="org.springframework.security.authentication.RememberMeAuthenticationProvider"> 
    <property name="key" value="comtestrememberme"/> 
    <aop:scoped-proxy/> 
</bean> 

<bean id="usernamePasswordAuthenticationFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager"/> 
    <property name="filterProcessesUrl" value="/j_spring_security_check"/> 
    <property name="rememberMeServices" ref="rememberMeServices"/> 
    <property name="authenticationSuccessHandler" ref="loginGuidAuthenticationSuccessHandler"/> 
    <property name="authenticationFailureHandler" ref="loginAuthenticationFailureHandler"/> 
</bean> 

<bean id="authenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
    <property name="loginFormUrl" value="/login"/> 
</bean> 

<bean id="extRememberMeProcessingFilter" class="com.test.security.filters.ExtRememberMeAuthenticationFilter"> 
    <property name="rememberMeServices" ref="rememberMeServices"/> 
    <property name="authenticationManager" ref="authenticationManager"/> 
</bean> 

помнить меня печенье становится создан и мой пользовательский фильтр используется, но проблема в том, что выход из системы никогда не бывает.

Когда я нажимаю кнопку выхода из системы, похоже, что я снова пройду процесс аутентификации, и клиент снова войдет в систему.

Если я вернусь к стандартным пружинным фильтрам, все будет работать нормально.

Я что-то пропустил в конфигурации?

+0

Весна не выбрасывает ошибку для 'position =" REMEMBER_ME_FILTER "'? – Thilak

+0

Нет, потому что я прокомментировал тег remember-me. –

ответ

1

Что может случиться здесь: ваш выход работает нормально, но вы не удалили myRememberMe cookie при выходе из системы. Итак, когда ваш сеанс становится недействительным при выходе из системы, помните, что службы создают новый сеанс, используя myRememberMe cookie.

Решение: вы можете изменить свою конфигурацию, добавив атрибут delete-cookies в свой тег <security:logout>.