Тайм-аут sesson Spring Security не распознается при вызове ajax - PullRequest
1 голос
/ 03 августа 2011

Я хочу перенаправить пользователей на страницу входа в систему по истечении времени ожидания сеанса. Это работает "из коробки" с пружинной безопасностью, но только для вызовов без AJAX.

При вызове ajax вы должны самостоятельно реагировать на время ожидания сеанса. Поэтому я создал мой собственный фильтр (фильтр реализован как в этот вопрос ), который проверяет, истекло ли время сеанса. Фильтр регистрируется с помощью тега custom-filter в конфигурации безопасности Spring.

<http use-expressions="true">
    <custom-filter ref="customTimeoutHandler" after="LAST"/>
</http>

Проблема в том, что время ожидания сеанса не распознается фильтром. Если я проверяю request.isRequestedSessionIdValid(), он возвращает true, даже если время сеанса истекло. Когда я ввожу новый защищенный URL-адрес вручную, стандартный фильтр безопасности Spring правильно распознает тайм-аут и перенаправляет на страницу входа.

Что здесь может быть не так? Как распознать весеннюю безопасность тайм-аут сессии?

UPDATE

Похоже, что фильтр управления сессиями весенней безопасности заменяет тайм-аут сеанса новым анонимным. Поэтому каждый раз, когда я проверяю тайм-аут сеанса, он возвращает true, потому что новый анонимный сеанс, конечно, не имеет тайм-аут.

Ответы [ 3 ]

2 голосов
/ 03 августа 2011

Вы можете проверить SecurityContext.Возьмите Authentication объект и проверьте власти в поисках ANONYMOUS объекта.Что-то вроде:

SecurityContext sc = SecurityContextHolder.getContext();
Authentication a = sc.getAuthentication();
if(!a.isAuthenticated() || a.getAuthorities().contains(new GrantedAuthorityImpl("ROLE_ANONYMOUS"))) {
    //user not authenticated or ANONYMOUS
} else {
    //user authenticated
}
0 голосов
/ 21 августа 2013

Я занимаюсь разработкой корпоративных приложений, включая gwt / gwtp и Spring Security. Я добавляю некоторые проблемы с истечением времени ожидания сеанса, потому что SimpleRedirectInvalidSessionStrategy, который по умолчанию используется, выполняет response.sendRedirect (), ответ html-страницы, который я хотел перенаправить, проглатывает gwt com.google.gwt.user.client.rpc.InvocationException как сообщение об исключении. и перенаправления не происходит.

для решения этого

1. Я определяю свой сеанс-manamgemt-фильтр cosutom для этого вам нужно в вашем конфигурационном файле spring-security.xml <session-management session-fixation-protection="none"/> этой весной secuirty не будет использовать фильтр управления сеансом по умолчанию.

  1. определить фильтр управления сеансом

    введите код здесь

{

 <custom-filter position="SESSION_MANAGEMENT_FILTER" ref="mySessionManagmentFilter"/>   


<beans:bean id="mySessionManagmentFilter"
                    class="org.springframework.security.web.session.SessionManagementFilter">

            <beans:constructor-arg index="0" ref="mySessionSecurityContextRepository"/>
            <beans:constructor-arg index="1" ref="mySessionAutenticationStrategy"/>

            <beans:property name="invalidSessionStrategy">
                <beans:ref local="myInvalidSessionStrategy"/>
          </beans:property>
        </beans:bean>


     <beans:bean id="mySessionSecurityContextRepository"
                    class='org.springframework.security.web.context.HttpSessionSecurityContextRepository'>
            <beans:property name='allowSessionCreation' value='false'/>
        </beans:bean>


<beans:bean id="mySessionAutenticationStrategy"
                class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
        <beans:constructor-arg name="sessionRegistry" ref="sessionRegistry"/>
        <beans:property name="maximumSessions" value="1"/>
        <beans:property name="exceptionIfMaximumExceeded" value="false"/>
        <beans:property name="alwaysCreateSession" value="true"/>
    </beans:bean>


<beans:bean id="myInvalidSessionStrategy"
                class="com.my.project.MyInvalidSessionStrategy">
        <beans:constructor-arg value="/login.jsp?timeout=1"/>
    </beans:bean>

}

здесь на заказ - MyInvalidSessionStrategy {

public class MyInvalidSessionStrategy implements InvalidSessionStrategy {

private final Logger logger = LoggerFactory.getLogger(getClass());
private final String destinationUrl;


public OperationalInvalidSessionStrategy(String invalidSessionUrl) {
    this.destinationUrl = invalidSessionUrl;

}

@Override
public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    String exMsg =session timeout ! , need to redirect to login page
    logger.warn(exMsg);
    throw new TimeOutException(exMsg);

}

}

}

поэтому, когда истекает время ожидания, новая реализация выдает исключение .. исключение может быть грузовик при обратном вызове gwt onFailure метод

проверьте тип исключения и по методу onFailure перенаправьте пользователя на страницу входа. с Window.Location.replace(GWT.getHostPageBaseURL() + "/login.jsp")

0 голосов
/ 17 августа 2011

Это решение работает для меня как шарм.

Основная идея - указать сервлет вместо страницы входа.Затем сервлет определяет, был ли запрос ajax-запросом, и если это так, он возвращает перенаправление на страницу входа в виде фрагмента xml.Браузер может интерпретировать этот фрагмент и перенаправляет на страницу входа.

...