5

Spring Security 処理認証で構成されたジャージー アプリがあります。jersey-spring パッケージは、私の web.xml にサーブレットとして登録されている SpringServlet クラスを提供しています。

認証とすべてが期待どおりに機能します。私が疑問に思っているのは、Jersey サーブレットを介して AuthenticationExceptions (およびその他のフィルター例外) を送信する方法です。これにより、ExceptionMapper を使用してそれらを処理できます。

元々、SpringServlet はフィルターとして構成されていましたが、いくつか読んだ後、サーブレットがフィルターでスローされた例外を処理できる必要があることを理解するようになりました (おそらくそれは間違った理解です)。サーブレットに変更した後、動作に変化はありません。Spring Security コードをトレースすると、HttpServletResponse が記述されている場所を確認できます。

私の質問: Spring Security フィルターによってスローされた例外を Jersey サーブレットに処理させることは可能ですか?

4

1 に答える 1

0

その方法は、Jersey を Spring Security から呼び出すか、Spring Security を Jersey から呼び出すかによって異なります。

Jersey コンテナー内から Spring Security を呼び出す場合は、適切な例外の例外マッパーを定義する以外に何もする必要はありません。

クライアントが Spring Security フィルターを通過したときにのみ Jersey を呼び出す場合、クライアント要求がこれらのフィルターを通過している間にスローされた例外は、Jersey によってキャッチされません (要求がまだ Jersey コンテナーに入っていないため)。例外を Jersey コンテナーに「取得」する 1 つの方法は、次のとおりです。

  1. AuthenticationExceptionカスタム認証フィルターで をキャッチしてメソッドを呼び出し (例外を渡します)、呼び出さないAuthenticationFailureHandler.onAuthenticationFailure()ことでフィルター チェーンを確実に切断します。FilterChain.doFilter()
  2. AuthenticationFailureHandlerSpring によって生成された例外を取得 (および再スロー) する、設計のジャージー リソースを呼び出すように構成します。HttpServletRequest.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION)

例外をジャージーランドに「取得」する方法は他にもあるかもしれませんが、これは過去に私にとってうまくいった方法の1つです。

于 2013-08-04T14:56:11.263 に答える