4

安全なBackbone.jsアプリ(SpringセキュリティATMを使用)を持っているので、ログインしているユーザーは有効なセッションCookie(JSESSIONID)を持っている必要があります。これで、このセッションが無効になり(削除、期限切れなど)、ユーザーがリクエストを行おうとすると、Springセキュリティはユーザーをログインフォームにリダイレクトしようとして302エラーを返します。

この回答で説明されているように、この302応答はブラウザーによって処理されるため(アプリに到達しません)、アプリに返されるのはcontenttype = "text / html"(ログインフォームを含む)の200OK応答です。 。

これは問題です。私のBackboneモデルがURLへの同期を行おうとすると、JSONが必要になるためです。この同期が有効なセッションなしで発生した場合、「application /json」が予期されているときに200の「text/html」応答が返され、でJSON解析エラーが発生しjQuery.extend.parseJSONます。

この質問/回答の大きな助けを借りて、私Backbone.syncは自分のエラー処理を使用するためにメソッドをオーバーライドしました。ただし、302がエラーハンドラに到達することはないため、リダイレクトを自分でオーバーライドすることはできません。

私の状況はこの質問と非常に似ていますが、問題の最終的な解決策は投稿されていません。ログインページへのリダイレクトを確実に行うための理想的な方法を誰かが教えてくれませんか?

4

2 に答える 2

3

でログインページを返す代わりに、認証されていない AJAX リクエストHTTP 200 OKを返すように Spring Security を構成する必要があります。リクエスト ヘッダーHTTP 401 Unauthorizedを確認することで、(通常のページ リクエストではなく) AJAX リクエストを検出できます。X-Requested-With: XMLHttpRequest

グローバル$.ajaxErrorハンドラを使用して401エラーをチェックし、そこにあるログイン ページにリダイレクトできます。

これが私たちがそれを実装した方法であり、うまく機能します。ただし、私は Spring の専門家ではないので、Spring Security の構成についてはあまり役に立ちません。

于 2013-01-11T16:10:41.637 に答える
0

編集。カスタムクッキーの代わりに、@fencliffが提供するソリューションを使用することをお勧めします。

XHRの他のフィールドを使用して、この状況を検出できると思います。特別なクッキーがそのトリックをするかもしれません。

SpringSecurity側から独自の認証失敗ハンドラーを定義できます。ログインページへのリダイレクトが発生した時点で、HttpServletResponseにクッキーを追加できるようになります。カスタムBackbone.syncメソッドはこのCookieをチェックします。存在する場合は、この場合のカスタムハンドラーを起動します(同時にcoockieを削除することを忘れないでください)。

<sec:http ... >
    <sec:form-login login-page='/login.html' authentication-failure-handler-ref="customAuthenticationFailureHandler" />
</sec:http>

<bean id="customAuthenticationFailureHandler" class="com.domain.CustomAuthenticationFailureHandler" />

CustomAuthenticationFailureHandlerは、org.springframework.security.web.authentication.AuthenticationFailureHandlerインターフェースを実装する必要があります。クッキーを追加してから、デフォルトのSimpleUrlAuthenticationFailureHandler.onAuthenticationFailure(...)実装を呼び出すことができます。

于 2013-01-11T14:18:56.433 に答える