2013-08-08 26 views
5

私はSpring 3.1を使ってJava Webアプリケーションを持っています。 My Springセキュリティコンテキストは、それぞれが異なる認証パス(例えば、ユーザ名/パスワード対シングルサインオン)に対応する複数の認証フィルタを定義する。各認証フィルタは、独自のAuthenticationSuccessHandlerを定義します。今、すべての認証タイプを、私は成功した認証時に取るように2つの追加アクションを注入したい、と彼らは全体に適用する必要があります複数のAuthenticationSuccessHandlersを最も簡単に呼び出す方法は?

  1. 設定Google Analyticsは、フロントエンドで使用するための追跡イベントコード
  2. データベースのユーザーの優先ロケールを更新してください。

これらは、ユーザーが正常に認証された後にフックしたい任意のアクションです。重要な点は、通常のAuthenticationSuccessHandlers(認証パスごとに異なる)とは異なり、要求を転送またはリダイレクトしないことです。だから、それらの束を呼び出すことは安全です。

Spring Web/Security 3.1を使用して、これらの追加の認証成功「アクション」を統合する明確な方法はありますか?

私はApplicationListener<AuthenticationSuccessEvent>を実装するに見えたが、私のイベントは、リクエストにアクセスする必要がある、とAuthenticationSuccessEventが提供するすべてのAuthenticationオブジェクトそのものです。

私は方法を見つけることができませんでしたので、私は私自身のプロキシをロールバックすることを決めた:

public class AuthenticationSuccessHandlerProxy implements AuthenticationSuccessHandler { 
    private List<AuthenticationSuccessHandler> authenticationSuccessHandlers; 

    public AuthenticationSuccessHandlerProxy(List<AuthenticationSuccessHandler> successHandlers) { 
     this.authenticationSuccessHandlers = successHandlers; 
    } 

    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request, 
             HttpServletResponse response, 
             Authentication authentication) throws IOException, ServletException { 
     for (AuthenticationSuccessHandler successHandler : this.authenticationSuccessHandlers) { 
      successHandler.onAuthenticationSuccess(request, response, authentication); 
     } 
    } 
} 

答えて

0

AbstractAuthenticationProcessingFilterのソースコードとAuthenticationSuccessHandler.onAuthenticationSuccess(...)が呼び出された他のすべての場所にbreafly見た後、私はいずれも表示されませんSpring Securityを使用して実行する可能性があります。

回避策として、成功ハンドラをいくつかのAspectJまたはAOPポイントカットにラップし、このポイントカットをAuthenticationSuccessHandler.onAuthenticationSuccess(...)実行に適用することができます。このように、すべての認証タイプを対象にすることができます。

関連する問題