私が取り組んでいるこのアプリケーションで「メソッド レベル」のセキュリティを試しています。アイデアは、DWR を使用してプレゼンテーション層から呼び出されるメソッドを保護することです。今、私は自分のメソッドに次の注釈を追加しようとしました:
@PreAuthorize("isAuthenticated() and hasRole('ROLE_CUSTOMER')")
そして、私のセキュリティコンテキストの対応するエントリ:
<global-method-security pre-post-annotations="enabled" />
同様の行で、@Secured アノテーションを試しました。
@Secured({"ROLE_CUSTOMER" })
そして、私のセキュリティコンテキストの対応するエントリ:
<global-method-security secured-annotations="enabled" />
理想的には、ユーザーが認証されていない場合は、「サインイン」ページにリダイレクトされ、「ROLES」がチェックされないようにする必要があります。この場合、認証されていないユーザーであっても、このメソッドを呼び出すと「AccessDeniedException」が発生します。このようなシナリオでは、ユーザーをログイン ページにリダイレクトする必要があります。
それを進めるために、カスタム AccessDenied Handler を作成して、accessdenied 例外を処理しようとさえしました。残念ながら、ハンドラーは呼び出されませんでしたが、例外がスローされました。
構成は次のとおりです。
<access-denied-handler ref="customAccessDeniedHandler"/>
これには、同じファイルで定義された対応するハンドラー Bean があります。
まだ運がありません。accessdeniedhandler が呼び出されることはありません。
要件を要約すると、メソッドを確保する必要があります。このメソッドが呼び出され、ユーザーが認証されていない場合、ユーザーは「サインイン」ページにリダイレクトされます (現在、アクセス拒否の実行がスローされています)。
あなたの助けに感謝します..
編集 1 : セキュリティ コンテキストからのスニペットを次に示します。
<http>
<intercept-url pattern="/*sign-in.do*" requires-channel="$secure.channel}" />
.....
.....
.....
<intercept-url pattern="/j_acegi_security_check.do" requires-channel="${secure.channel}" />
<intercept-url pattern="/*.do" requires-channel="http" />
<intercept-url pattern="/*.do\?*" requires-channel="http" />
<form-login login-page="/sign-in.do" authentication-failure-url="/sign-in.do?login_failed=1"
authentication-success-handler-ref="authenticationSuccessHandler" login-processing-url="/j_acegi_security_check.do"/>
<logout logout-url="/sign-out.do" logout-success-url="/index.do" />
<session-management session-authentication-strategy-ref="sessionAuthenticationStrategy" />
<access-denied-handler ref="customAccessDeniedHandler"/>
</http>
<beans:bean id="customAccessDeniedHandler" class="com.mypackage.interceptor.AccessDeniedHandlerApp"/>