Spring Security не перенаправляет на последнюю запрашиваемую страницу входа в систему после тайм-аута сеанса - PullRequest
3 голосов
/ 14 мая 2019

Я использую Spring Security 4.2.2.RELEASE в моем приложении. Когда происходит тайм-аут, а затем пользователь щелкает любой URL-адрес, он перенаправляется на страницу выхода из системы, а после успешной аутентификации он перенаправляется на домашнюю страницу по умолчанию, а не на запрашиваемую страницу.

Веб-XML выглядит следующим образом:

<bean id="logoutSuccessHandler"
         class="org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler">
         <property name="useReferer" value="true"/>
     </bean>


    <security:form-login
            login-page="/login"
            authentication-failure-url="/login_error"
            username-parameter="username"
            password-parameter="password"
            default-target-url="/home"
            always-use-default-target="false"
            />

Я хочу, чтобы он перенаправлял на запрашиваемую страницу, когда аутентификация прошла правильно. Я читал, что эта функция предоставляется по умолчанию в Spring Security. Но это не работало, поэтому я пытался реализовать с помощью SimpleUrlLogoutSuccessHandler. Но все еще не мог найти способ обойти это. Так что здесь может пойти не так?

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Первое включение одновременной поддержки управления сеансом заключается в добавлении следующего слушателя в web.xml:

<listener>
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
  </listener>

  <session-config>
    <session-timeout>30</session-timeout>
  </session-config>

После истечения времени ожидания сеанса, если пользователь отправляет запрос с просроченным идентификатором сеанса, они будут перенаправлены на настраиваемый URL-адрес. Аналогично, если пользователь отправляет запрос с идентификатором сеанса, срок действия которого не истек, но совершенно недействителен, он также будет перенаправлен на настраиваемый URL-адрес: security.xml

<session-management invalid-session-url="/sessionexpiredPage.htm" session-authentication-error-url="/forms/common/login.jsp?error=alreadyLoggedin" session-fixation-protection="none" >
            <concurrency-control expired-url="/sessionexpiredPage.htm" max-sessions="5" error-if-maximum-exceeded="true"  />
        </session-management>

Соответствующий код Java:

@Audit(option = "Session Expire", action = "Session Expired")
    @RequestMapping(value = "/sessionexpiredPage.htm")
    public ModelAndView sessionExpired(HttpSession session, HttpServletRequest request) {
        clLogger.logMethodEntry("sessionexpiredPage");
        ModelAndView model = new ModelAndView();
        String userId = (String) session.getAttribute("USER_ID");
        if(userId == null) {
            model.setViewName("sessionexpiredPage");
        }else {
            model.setViewName("getHomePage");
        }
        clLogger.logMethodExit("sessionexpiredPage");
        return model;

    }
0 голосов
/ 14 мая 2019

Ну, вам нужно реализовать SimpleUrlAuthenticationSuccessHandler. Это поможет вам в обработке перенаправлений.

    <http>
    <intercept-url pattern="/login" access="permitAll"/>
    <intercept-url pattern="/**" access="isAuthenticated()"/>
    <form-login authentication-success-handler-ref="refererHandler" />
</http>

<beans:bean
  class="RefererRedirectionAuthenticationSuccessHandler"
  name="refererHandler"/>

И реализуем так:

    public class RefererRedirectionAuthenticationSuccessHandler 
  extends SimpleUrlAuthenticationSuccessHandler
  implements AuthenticationSuccessHandler {

    public RefererRedirectionAuthenticationSuccessHandler() {
        super();
        setUseReferer(true);
    }
    }
...