6

SSO に Spring/Java と SAML 2.0 を使用する (Spring Security SAML 拡張機能を利用する) AngularJS アプリがいくつかあります。私の SSO ID プロバイダーは OpenAM で、すべてがうまく機能しています。ただし、ユーザーが 1 つのアプリケーション内からグローバル ログアウトを行ったが、他のタブが開いているという状況に陥っています。これらは単一ページの Web アプリであるため、ユーザーが ajax 要求を呼び出すために何らかの操作を行うまで、孤立したタブで多くの機能を使用できる可能性があります。もちろん、これらの AJAX リクエストは Spring Security SAML フィルターによってインターセプトされ、REDIRECT を介して OpenAM ログイン URL への認証試行をトリガーします。もちろん、AJAX 要求では別のドメインへのリダイレクトが許可されていないため、これはブラウザーに大混乱をもたらします。さらに、Angular では本当に何もできません。■ 要求が「キャンセル」され、品質情報が $http エラー コールバック関数 (便利な 401/403 ステータス コードなど) で利用できない場合の $http インターセプタ。私が知っているのは、リクエストが失敗したということだけです。

失敗には正当な理由がある可能性があるため、すべての悪い $http 要求が認証の問題によるものである (および $window.location.reload() を実行する) とは想定したくありません。私の好みは、ajax リクエストの Spring Security リダイレクト (OpenAM ログイン ページへの) を抑制し、代わりに 401/403 ステータス コードを送り返すことです。これにより、$http インターセプターでエラーを処理し、認証に失敗した場合はページ全体を読み込むことができるため、初めてサイトにアクセスしたかのようにログイン ページにエレガントにリダイレクトできます。

これを達成する方法についてのアイデアはありますか?

4

2 に答える 2

4

認証の初期化と、HTTP エラーを返したり、リダイレクトを実行したりする決定を行う Bean は、 のインスタンスですAuthenticationEntryPoint。その動作を変更するには、次のいずれかを実行できます。

  • 現行をカスタマイズSAMLEntryPoint(メソッドを拡張commence) し、リクエストが Angular からの AJAX 呼び出しである場合にデフォルトの動作をオーバーライドするため、IDP へのリダイレクトを実行する代わりに HTTP エラーを返します。
  • または、Spring コンテキストで (現在のコンテキストの前に) 別の要素を定義security:httpします。この要素は、AJAX リクエストのみをカバーし (たとえば、 attributepattern="/api/**"を使用)、希望どおりに動作するエントリ ポイントを使用します (「 」を参照Http403ForbiddenEntryPoint) 。
于 2014-09-26T08:44:06.560 に答える
0

https://www.jasha.eu/blogposts/2015/10/saml-authentication-angularjs-spring-security.htmlから取得した Vladimir の最初の箇条書きの実装の可能性を参照

public class XhrSamlEntryPoint extends SAMLEntryPoint {

  @Override
  public void commence(HttpServletRequest request, HttpServletResponse response,
                       AuthenticationException e) throws IOException, ServletException {
    if (isXmlHttpRequest(request) && e instanceof InsufficientAuthenticationException) {
      response.sendError(HttpServletResponse.SC_UNAUTHORIZED, e.getMessage());
      return;
    }
    super.commence(request, response, e);
  }

  private boolean isXmlHttpRequest(HttpServletRequest request) {
    return "XMLHttpRequest".equalsIgnoreCase(request.getHeader("X-Requested-With"));
  }
}

X-Requested-With は必須ヘッダーではないため、この回答によると検出は防弾ではないことに注意してください。私の場合、バックエンドはSPAフロントエンドで使用されていたため、ajax呼び出しのチェックを完全に削除しました。

于 2019-06-19T21:45:53.807 に答える