2017-08-11 53 views
0

私のプロジェクトでは、JavaのSpringセキュリティとSAML拡張を使用しています。エラーが発生したときにSAMLトークンをログに表示する必要があります。 SimpleUrlAuthenticationFailureHandlerをオーバーライドして、自分で実装しました。私はSpring SAML認証の失敗ハンドラとログ

私はonAuthenticationFailure方法の体内からSAMLトークンを取得するにはどうすればよい
public void onAuthenticationFailure(HttpServletRequest request, 
     HttpServletResponse response, AuthenticationException exception) 

に渡されたオブジェクトを見て、例外のタイプを調べることができますか? onAuthenticationFailureメソッドはエラーを処理するための中心的な場所です。私はログにSAMLトークンを表示したい。私は、静的認証オブジェクトを取得しようとしている:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 

私は認証の対象からSAMLCredentialを得るために期待していたが、上記のリターンが認証オブジェクトの場合はNULL。

私が試したもう一つの問題は、AuthenticationExceptionをオーバーライドし、トークンを格納するカスタムString属性を追加することです。 AuthenticationExceptionは、この種のカスタマイズを提供するためにオーバーライドされることを意図しています。これは部分的にしか機能しません。 Spring/SAML APIが認証時にloadUserBySAML(...)メソッドを呼び出した後に、カスタム例外をスローすることができます。私は自分のカスタム例外内にトークンを格納し、後でそれを参照することができます。これは、ユーザーが見つからないなどのいくつかのタイプの例外に対して機能します。

loadUserBySAMLの呼び出し(つまり証明書やダイジェストの失敗)の前に問題が発生した場合、Spring/SAMLの組み込みクラスをオーバーライドしない限り、独自のカスタム例外をスローする機会はありません。私はむしろ特にロギングのためにこれらのクラスをあまりにも多くオーバーライドしないでしょう。私はもっ​​と簡単なものを探しています。

onAuthenticationFailureメソッドのコンテキスト内でSAMLトークンを取得できなかった別の方法がありますか?

答えて

0

あなたはクラスでSAMLContextProvideをautowireと、次のようなトークンを取得することができます:

try { 
     SAMLMessageContext context = contextProvider.getLocalEntity(request, response); 
     processor.retrieveMessage(context); 
     SAMLAuthenticationToken token = new SAMLAuthenticationToken(context); 
     SAMLMessageContext credentials = token.getCredentials(); 
     //credentials.getPeerEntityId(); // e.g. for getting IdP entity ID 
    } catch (Exception e) { 
     errorMsg = e.getMessage(); 
    } 

``

@Autowired 
public SAMLContextProvider contextProvider; 

の方法で、その後

関連する問題