6

次のコードで例外ハンドラーを設定しています

@ExceptionHandler(Throwable.class)
public @ResponseBody CustomResponse handleException(Throwable throwable){
    // handles exception, returns a JSON
}

SpringSecurity3.1を使用しています。認証なしで操作を行おうとすると、アプリケーションはAccessDeniedExceptionをスローします。この方法には決してなりません。ただし、他の例外を除いて正常に動作します。それはそれが機能することになっている方法ですか?または、私のコードに何か問題がありますか?

これは解決策のように見えます。しかし、一点で例外を処理できればもっと良いでしょう。

これが私の設定ファイルです

<global-method-security secured-annotations="enabled" pre-post-annotations="enabled" />
<http auto-config="true" use-expressions="true">
    //intercept urls
    <form-login login-page="/signin" default-target-url="/" always-use-default-target="true"/>
</http>

<authentication-manager>
    <authentication-provider user-service-ref="userDetailsService">
        <password-encoder ref="encoder" />
    </authentication-provider>
</authentication-manager>

<!-- This encoder doesn't require a salt -->
<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />

アップデート

ここでは、ユーザーは認証されていません(ROLE_ANONYMOUS)。保護されたページにアクセスしようとすると、ログインURLにリダイレクトされます。ここでの私の問題は、AJAX呼び出しを行うことです。したがって、ModelAndViewを返すメソッドへのリダイレクトは機能しません。この辺りに仕事はありますか?

4

2 に答える 2

10

Spring Securityのリクエスト処理はすべて、ディスパッチャーサーブレットが呼び出される前にフィルターチェーンで行われるため、Spring MVC例外ハンドラーについては何も知らず、実際にはSpringMVCなしで使用できます。

表示されているのは、認証されていないユーザーの予想される動作ですが、Ajax呼び出しがUIコードにリダイレクトされることは望ましくありません。認証されていないajax呼び出しの動作を明確にしないため、最善の解決策を正確に言うことは困難です。たとえば、403で単純に失敗させたい場合は、ajaxAPIを別のフィルターチェーンに分離できます。たとえば、ajax呼び出しで/ajaxapi、既存のチェーン定義の前に次のチェーン定義を追加できます。

<http pattern="/ajaxapi/**" create-session="never" use-expressions="true" entry-point-ref="entryPoint">
    <intercept-url pattern="/**" access="isAuthenticated()" />
</http>

<bean entryPoint="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" />

その後、ajax呼び出しはすべて、ユーザーがブラウザーインターフェイスを介して認証されるまで403応答を受け取ります。

于 2013-01-20T15:01:49.637 に答える
2

<access-denied-handler>春のセキュリティ構成でを定義したと思います。このハンドラーはをキャッチしていAccessDeniedExceptionます。それがおそらくあなたがあなたのジェネリックでそれを取得しない理由ですExceptionHandler

デフォルトのAccessDeniedHandlerがあります(デフォルトのスプリングセキュリティ設定が付属しています)。詳しくはこちらをお読みください。

于 2013-01-20T11:45:49.567 に答える