12

私は、AngularJS を使用し、Tomcat で実行されている Java REST バックエンドと連携する HTML 5 アプリケーションを作成しました。Spring Security を使用してログインとセキュリティを処理します。

ユーザーが Web サイトに入ると、セッションを作成してインデックス ページにリダイレクトするログイン ページに転送されます。サーバーからさらにデータをロードする REST 呼び出しは、そのセッションを使用して認証します。セッションが整っていない場合は、HTTP 経由の基本認証にフォールバックして、Web アプリケーションとは別に REST エンドポイントを呼び出すことができるようにします。

私が今抱えている問題は、セッションの有効期限が切れたときです。これによりHTTP 401 Unauthenticated、サーバーからの応答が発生します。そのエラーをキャッチして、Javascript を使用してユーザーをログイン ページにリダイレクトできると考えました。ただし、エラー ハンドラーが呼び出される前に、ブラウザーは最初にログイン ウィンドウを表示します。[キャンセル] をクリックした場合にのみ、Javascript エラー ハンドラーが応答を処理できます。

私の質問は、ブラウザがこのログイン ウィンドウを表示しないようにする方法はありますか? それとも、これは私のアプリケーション設計の一般的な問題ですか?

別の方法として、セッションをまったく使用せず、ユーザー名とパスワードをアプリケーションにキャッシュすることもできます。次に、基本認証を使用してすべての REST 呼び出しでそれを送信する必要がありますが、それはより良いアプローチでしょうか?

以下は、サーバーからの HTTP 応答です。

HTTP/1.1 401 Unauthorized
Server: Apache-Coyote/1.1
WWW-Authenticate: Basic realm="Spring Security Application"
Content-Type: text/html;charset=utf-8
Content-Length: 999
Date: Mon, 30 Sep 2013 11:00:34 GMT

更新:これの理由はWWW-Authenticate、ブラウザーにログイン ダイアログを表示させるヘッダーにあるようです。

4

2 に答える 2

11

私は最終的にこれに対する解決策を見つけました。更新で述べたように、その理由は、応答にWWW-Authenticateヘッダー フィールドが含まれているためです。私の解決策は、Spring Security の構成を変更して、別のヘッダーを返すことでした。

WWW-Authenticate: FormBased

これを行うには、AuthenticaitonEntryPointインターフェイスを実装し、応答のヘッダーとステータス コードを手動で設定する必要がありました。

@Component( "restAuthenticationEntryPoint" )
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence( HttpServletRequest request, HttpServletResponse response,
                          AuthenticationException authException ) throws IOException {
        response.setHeader("WWW-Authenticate", "FormBased");
        response.setStatus( HttpServletResponse.SC_UNAUTHORIZED );
    }
}

次に、spring-security の構成を変更entry-point-refし、新しいクラスを指すように設定しました。

<http pattern="/rest/**" create-session="never" entry-point-ref="restAuthenticationEntryPoint">
    <intercept-url pattern="/rest/**" access="ROLE_USER" />
    <http-basic />
    <session-management />
</http>
于 2013-09-30T20:12:55.973 に答える
0

WWW-Authenticateサーバーを変更せずに、他のすべての呼び出し元に対してヘッダーを返すようにしたい場合は、クライアントを変更して、値を含むX-Requested-Withヘッダー付きのリクエストを送信できXMLHttpRequestます。デフォルトでは、Spring Security はWWW-Authenticateそのようなリクエストを送信しません。(スプリングソースを参照)

于 2017-10-15T13:39:03.720 に答える