2012-02-21 11 views
2

I持ってJSFと春のセキュリティでタイムアウトと次のような問題:ユーザーがinvalidSessionUrlにリダイレクトされるように要求されたページが確保されているだけであれば、私はsessionmanagementフィルタをカスタマイズしたJSF春のセキュリティセッションタイムアウトviewExpiredException

(つまり、認証されたユーザーだけが許可されている場合)。私は春のセキュリティが提供するセッション管理フィルターに入れたカスタムコードは次のとおりです。

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(リクエスト)」要求されたページをこのように返します。

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)」は、paramがユーザーの認証を必要とするページである場合にtrueを返します(私のxmlセキュリティコンフィグファイルのインターセプト-url要素を考慮して、IFでチェックを行います。属性は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が表示されません。

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

ありがとうございます。

+0

'invalidSessionUrlへのリダイレクトを迂回しましたが、セッションの有効期限が切れたため、同じページを再レンダリングしようとしました。私はこれが何を意味するのか分かりません。 invalidSessionUrlを再レンダリングすると、ViewExpiredExceptionが発生すると言っていますか? –

+0

独自のセッション管理フィルタを作成するのはなぜですか? Springセキュリティでは、この機能をそのまま使用できます。あなたのSpring XML設定に ' ... ' –

+0

あなたの1番目のコメントに答えてください:' invalidSessionUrlへのリダイレクトをバイパスしましたが、セッションが途中で終了すると、同じページを再度レンダリングしようとする例外が発生します。タイムアウトが発生したときにブラウザが表示している保護されていないページを再レンダリングすると、 "viewExpiredException"が発生することを意味します。これは、セッションが期限切れになっているため、JSFがページのビューを構築できないために発生します。 Spring Securityでは、ページが保護されていないため(これは問題ありません)、JSFがページを再レンダリングしようとすると例外がスローされるため、セッション管理フィルタがスキップされます。 – choquero70

答えて

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; 
} 

は、今の問題は、ページのパラメータを持っていた場合、私が最近作成したビューにポストを行うとき、私はそれらを失ったが、それはだということですもう1つの別の問題(PRGパターン)はJSFを再び扱っています。

3

春のセキュリティでは、認証されていないユーザーのページセットに対する匿名アクセスが必要です。以下は私の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インタフェースを実装し、GrantedAuthorityインタフェースを実装するロールBeanを返すプロパティを持つ必要があります。 SpringはUserDetailsを探して、ロールが何であるかを判断するためにGrantedAuthorityプロパティを探します。このユーザーが存在しない場合、認証されていない、または不明の場合は、デフォルトで匿名の役割になります。

+0

私はあなたの言うことを知っていますが、それは私が探しているものではありません。あなたのシナリオを参照すると、アクセスプロパティ "IS_AUTHENTICATED_ANONYMOUSLY"を持つページ(つまり、任意のページ)をリクエストすると、セッションがタイムアウトしたときに、sesion-management-filterによってinvali-session-urlにリダイレクトされます誰がパターン "/*.xhtml"にマッチし、それがadminかappディレクトリにない)。しかし、私が望むものは、その場合invalid-session-urlにリダイレクトされません。セッションがタイムアウトしていないかのように要求したページを表示します(つまり、その場合はsession-management-filterを適用しません) – choquero70

関連する問題