Тайм-аут сеанса безопасности jsf viewExpiredException - PullRequest
2 голосов
/ 22 февраля 2012

У меня следующая проблема с таймаутами в Spring Security с JSF:

Я настроил фильтр управления сеансом так, чтобы пользователь перенаправлялся на invalidSessionUrl только в том случае, если запрошенная страница защищена (т. Е. Если она разрешена только для аутентифицированных пользователей). Пользовательский код, который я вставил в фильтр управления сеансами, предоставляемый Spring Security:

if (invalidSessionUrl != null) {
     String pagSolicitada = UtilSpringSecurity.extraerPagina(request);
     if ( UtilSpringSecurity.paginaAutenticada(pagSolicitada ) ) {
          request.getSession();
          redirectStrategy.sendRedirect(request, response, invalidSessionUrl);
          return;
     }
     //the requested page doesn't require the user to be authenticated
     //so i just skip this filter and continue with the filter chain
     chain.doFilter(request, response);
     return;
}

Метод "UtilSpringSecurity.extraerPagina (request)" возвращает запрошенную страницу следующим образом:

public static String extraerPagina (HttpServletRequest request) {
     String uri = request.getRequestURI().toLowerCase();
     String cPath = request.getContextPath().toLowerCase();
     // uri = cPath + pagina
     int longCPath = cPath.length();
     String pagina = uri.substring(longCPath);
     return pagina;
}

И метод "UtilSpringSecurity.paginaAutenticada (pagSolicitada)" возвращает значение true, если параметром является страница, требующая аутентификации пользователя (я проверяю с помощью IF, учитывая элементы intercept-url моего файла конфигурации безопасности xml которые имеют атрибут access="isAuthenticated()"):

public static boolean paginaAutenticada (String pagina) {

     if (pagina.startsWith("/faces/paginas/administracion/") || pagina.startsWith("/faces/paginas/barco/") ) {
          return true;
     }
     return false;
}

Это решение работает, но у него есть только одна проблема:

Если я оставлю браузер бездействующим на странице, пока не истечет время ожидания сеанса, а затем я запрашиваю ту же страницу, я получаю «viewExpiredException». Это потому, что фильтр работал хорошо, он обошел перенаправление на invalidSessionUrl, но, так как сеанс истек в любом случае, я получаю это исключение, пытаясь повторно отрисовать ту же страницу.

Если я запрашиваю любую другую незащищенную страницу после истечения времени ожидания сеанса, он работает хорошо, он перенаправляет на страницу правильно, и я не получаю исключение viewExpiredException.

Кто-нибудь знает, как это решить?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

Spring Security должен предоставить вам анонимный доступ к наборам страниц для неаутентифицированного пользователя.Ниже приведен отрывок из моей конфигурации XML о том, как я этого добился.

<http auto-config="true" access-denied-page="/unauthorized.xhtml" >
    <intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
    <intercept-url pattern="/app/**" access="ROLE_USER,ROLE_ADMIN" />
    <intercept-url pattern="/*.xhtml" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <form-login login-page="/login.xhtml" login-processing-url="/j_spring_security_check"
        authentication-success-handler-ref="authenticationSuccessBean"
        authentication-failure-handler-ref="authenticationFailureBean"  />
    <session-management invalid-session-url="/login.xhtml" >
    </session-management>
</http>

Я по существу использую теги intercept-url, чтобы утверждать, что страницы в определенных относительных контекстах могут быть доступны только для следующих ролей.Вы можете видеть, что все страницы в контексте веб-приложения по умолчанию доступны для анонимных пользователей.Если пользователь не авторизован для просмотра страницы, он будет перенаправлен на access-denied-page.

. Единственная проблема заключается в том, что ваш пользовательский компонент должен реализовать интерфейс UserDetails и иметь свойство, которое возвращает компонент роли.который реализует интерфейс GrantedAuthority.Spring будет искать для UserDetails свойство GrantedAuthority, чтобы определить роль.Если этот пользователь не существует, не прошел проверку подлинности или неизвестен, то по умолчанию ему назначается анонимная роль.

0 голосов
/ 21 марта 2012

Наконец я решил это. Это проблема JSF, никак не связанная с Spring Security.

Я переопределил метод restoreView в jsf следующим образом:

@Override
public UIViewRoot restoreView(FacesContext facesContext, String viewId) {
     UIViewRoot root = wrapped.restoreView(facesContext, viewId);
     if(root == null) {
          root = createView(facesContext, viewId);
     }
     return root;
}

Теперь проблема в том, что если на странице были параметры, я терял их, когда выполняю публикацию в недавно созданном представлении, но это еще одна отдельная проблема (шаблон PRG), снова касающаяся JSF.

...