Spring 3.2.2 および Majorra 2.1.25 で Spring-Security 3.1.3 を使用しています。マネージド Bean は使用しませんが、SpringBeanFacesELResolver を使用します。基本的に、私はすべてに春を使用しています。
私は以下を使用します
<http auto-config="true">
<form-login login-page="/components/public/login.jsf" authentication-failure-handler-ref="customAuthenticationFailureHandler" />
<intercept-url pattern="/components/admin/**" access="ROLE_ADMIN" />
<intercept-url pattern="/components/secured/**" access="ROLE_USER,ROLE_ADMIN" />
<intercept-url pattern="/**" />
<session-management>
<concurrency-control max-sessions="1" expired-url="/components/public/sessionExpired.jsf" />
</session-management>
<access-denied-handler ref="customAccessDeniedHandler" />
</http>
これは意図したとおりに機能します。たとえば、保護されたページにアクセスすると、ユーザーはログインに誘導され、ログイン後に要求されたページに移動します。彼が管理ページにアクセスしようとしても、ROLE_USER しか持っていない場合、customAccessDeniedHandler によってアクセス拒否ページに誘導されます。
ここまでは順調ですね。問題は次のとおりです@Secured({ "ROLE_ADMIN" })
。メソッドで使用します。権限が不十分なユーザーがこのメソッドにアクセスすると、AccessDeniedException がスローされます。BUT : 私の customAccessDeniedHandler は呼び出されません! 何故ですか?
詳細情報: メソッドは AJAX 呼び出しの一部として呼び出され、ハンドラーを使用して FacesMessage をフィードバックとして設定したいと考えています。これを一元的に行うにはどうすればよいですか?これに別のメソッドをラップし、try-catch を使用して自分で AccessDeniedException をキャッチできると確信しています。しかし、セキュリティで保護する必要があるすべてのメソッドに対してこれを行うと、大量の不要な try-catch メソッドでコードが肥大化するだけです。例外を一元的に処理するにはどうすればよいですか?