1

Я использую весеннюю безопасность 4.1, проблема, с которой я сталкиваюсь, когда я пытаюсь войти в систему, я снова отправляется на страницу с истекшим сроком сессии. Я попробовал несколько вещей, как добавление свой собственный HttpSessionListener также путем добавления org.springframework.security.web.session.HttpSessionEventPublisher но сессия продолжает истекающий. Я прочитал в одном из вопросов объяснение такого поведения. «Возможно, Spring Spring в некоторых случаях может аннулировать сеанс (например, после входа в систему пользователь получает новую HttpSession)». Я использовал инструмент Fiddler, чтобы увидеть, что происходит, я вижу, что пользователь аутентифицирован, но мгновенно перенаправляется на страницу с истекшим сроком действия. Я хочу, чтобы тот же пользователь мог войти столько раз, сколько захочет. Я также читал в некоторых местах, что это поможет перейти к весне 3.x, но я предполагаю, что это может быть для случаев, когда использовалась более старая версия весны. , пожалуйста, предложите. СпасибоВесенняя сессия сеанса безопасности

<http auto-config="true" use-expressions="true" 
    authentication-manager-ref="authenticationManager"> 
    <session-management 
    invalid-session-url="/login?eventType=sessionTimedOut" 
    session-fixation-protection="none" 
    /> 
    <intercept-url pattern="/login" access="permitAll" /> 

    <intercept-url pattern="/*"  access="hasAnyAuthority('FF_USER','FF_ADMIN')" /> 

    <form-login login-page="/login" 
     authentication-success-handler-ref="authenticationSuccessHandler" 
     authentication-failure-handler-ref="customAuthenticationFailureHandler" 
     login-processing-url="/j_spring_security_check" 
     username-parameter="j_username" 
     password-parameter="j_password" 
     /> 

    <logout invalidate-session="false" logout-success-url="/login?eventType=logout" 
     logout-url="/j_spring_security_logout" delete-cookies="JSESSIONID"/> 

    <csrf token-repository-ref="csrfTokenRepository" /> 

</http> 

<beans:bean id="csrfTokenRepository" 
    class="org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository"> 
    <beans:property name="headerName" value="X-XSRF-TOKEN" /> 
</beans:bean> 

<beans:bean id="authenticationSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler"> 
    <beans:property name="defaultTargetUrl" value="/home"/> 
    <beans:property name="alwaysUseDefaultTargetUrl" value="true"/> 
</beans:bean> 

<beans:bean id="customAuthenticationFailureHandler" class="*.*.CustomAuthenticationFailureHandler"> 
    <beans:property name="defaultFailureUrl" value="/login?eventType=error"></beans:property> 
    <beans:property name="baseFailureUrl" value="/login?eventType=error"></beans:property> 
</beans:bean> 

<beans:bean id="authenticationManager" 
    class="org.springframework.security.authentication.ProviderManager"> 
    <beans:constructor-arg> 
     <beans:list> 
      <beans:ref bean="ldapAuthenticationProvider" /> 
     </beans:list> 
    </beans:constructor-arg> 
    <beans:property name="eraseCredentialsAfterAuthentication" 
     value="true" /> 
</beans:bean> 

ответ

0
<http> 
    <logout delete-cookies="JSESSIONID" /> 
    </http> 

Unfortunately this can't be guaranteed to work with every servlet container, so you will need to test it in your environment[8].

Так что вам нужно, чтобы добавить обработчик выхода из системы клиента, который реализует LogoutHandler в LogoutFilter обработчик.

<http auto-config="true" use-expressions="true" authentication-manager-ref="authenticationManager"> 
... 
<custom-filter ref="logoutFilter" position="LOGOUT_FILTER" /> 
... 
</http> 


<bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter"> 
     <constructor-arg name="logoutSuccessUrl" value="/login?eventType=logout" /> 
     <!-- implement LogoutHandler, Websphere log out --> 
     <constructor-arg name="handlers" ref="{customer logout }" /> 
     <property name="filterProcessesUrl" value="/j_spring_security_logout" /> 
</bean> 
+0

Я тоже использовал это. В этом случае, когда я выхожу из системы, я отправляется на страницу с истекшим сроком сеанса вместо страницы выхода из системы. Эта проблема возникает периодически, я могу войти в систему, если я снова попробую, но проблема в том, почему сеанс истекает сразу после входа в систему. Он должен быть запущен и оставаться неповрежденным в течение времени, указанного в web.xml. У меня была такая же проблема, даже с указанным выше изменением. Я использую Websphere, может быть, там что-то можно изменить? – hims

+0

[erase-cookie-in-websphere-how-to-log-out] (http://stackoverflow.com/questions/27466797/erase-cookie-in-websphere-how-to-logoutout) и [WSSecurityHelper ] (http://www.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.javadoc.doc/web/apidocs/com/ibm/websphere/security/WSSecurityHelper.html), это может быть полезно , вам нужно добавить обработчик выхода, который реализует 'LogoutHandler' обработчикам' LogoutFilter' – chaoluo

+0

Это не помогло, я действительно обнаружил, что было два запроса для входа в систему с моего конца, и однажды я решил, что этого поведения не произошло еще раз. Спасибо за помощь. Я действительно ценю, что вы делитесь своими идеями. – hims

Смежные вопросы