2

Spring SecuritywithJSFのタイムアウトに関して次の問題があります。

要求されたページが保護されている場合(つまり、認証されたユーザーのみに許可されている場合)にユーザーがinvalidSessionUrlにリダイレクトされるように、セッション管理フィルターをカスタマイズしました。SpringSecurityが提供するセッション管理フィルターに入れたカスタムコードは次のとおりです。

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を使用してチェックを行い、xmlセキュリティ構成ファイルのintercept-url要素を考慮します。属性access="isAuthenticated()"):

public static boolean paginaAutenticada (String pagina) {

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

このソリューションは機能しますが、問題が1つだけあります。

セッションのタイムアウトが切れるまでブラウザをページでアイドル状態のままにして、同じページをリクエストすると、「viewExpiredException」が発生します。これは、フィルターが正常に機能し、invalidSessionUrlへのリダイレクトをバイパスしたためですが、とにかくセッションが期限切れになると、同じページを再レンダリングしようとすると例外が発生します。

セッションタイムアウトの期限が切れたときに他のセキュリティで保護されていないページを要求すると、正常に機能し、ページに正しくリダイレ​​クトされ、viewExpiredExceptionが発生しません。

誰もがこれを解決する方法を知っていますか?

前もって感謝します。

4

2 に答える 2

3

Spring セキュリティは、認証されていないユーザーの一連のページへの匿名アクセスを提供する必要があります。以下は、これをどのように達成したかについての私の 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タグを使用して、特定の相対的なコンテキスト内のページには次のロールのみがアクセスできると主張しています。Web アプリケーションのデフォルト コンテキストのすべてのページが匿名ユーザーに利用可能であることがわかります。ユーザーがページを表示する権限がない場合、ユーザーは にリダイレクトされaccess-denied-pageます。

唯一の問題は、ユーザー Bean がインターフェースを実装し、UserDetailsインターフェースを実装するロール Bean を返すプロパティを持つ必要があることGrantedAuthorityです。Spring は、ロールが何であるかを決定UserDetailsするプロパティを持つを探します。GrantedAuthorityこのユーザーが存在しない、認証されていない、または不明な場合、デフォルトで匿名ロールになります。

于 2012-02-23T18:55:47.250 に答える
0

最後に私はそれを解決しました。これは JSF の問題であり、Spring Security とは関係ありません。

この方法で jsf の restoreView メソッドをオーバーライドしました。

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

ここでの問題は、ページにパラメーターがある場合、最近作成したビューにポストするときにそれらを失ったことですが、これは JSF を再び扱う別の問題 (PRG パターン) です。

于 2012-03-21T01:00:12.250 に答える