2012-11-06 41 views
8

メソッドレベルのセキュリティを備えたSpring Security 3.1.3-RELEASEを使用しています。それは完全に動作します。Spring SecurityでAccessDeniedExceptionの '理由' /原因を取得する方法は?

私はログに記録したいと思うかもしれません。なぜ彼はアクセスを拒否されていますか?

org.springframework.security.web.access.AccessDeniedHandlerImplサブクラスを使用すると、org.springframework.security.access.AccessDeniedExceptionへの参照を取得できますが、原因を特定する方法が見つからない(例: 'ROLL_ADMINがありません'など)。

私に何かがないか、それとも単に存在しないのですか?

+0

同じ問題がここのように定義されたエラーを取得することができます。 AccessDecisionVotersがACCESS_GRANTEDまたはACCESS_DENIEDを返すだけでなく、理由/原因を保持できるAccessDeniedDecisionを返す場合は便利です – Janning

+1

jiraの問題を作成しました:https://jira.springsource.org/browse/SEC-2148 – Janning

答えて

4

残念ながら、Spring Securityで使用できるデフォルトの実装では不可能です。

私は

MethodSecurityInterceptorは、メソッド呼び出しを保護するための責任があるソースコードを調査し...。アクセスの決定をAccessDecisionManagerに委任します。 私はAccessDecisionManagerのすべての実装をチェックしました。

  • UnanimousBased

をConsensusBased AffirmativeBasedそれらのそれぞれは、同様の方法でAccessDeniedException例外がスローされます。

case AccessDecisionVoter.ACCESS_DENIED: 
       throw new AccessDeniedException(
         messages.getMessage("AbstractAccessDecisionManager.accessDenied", 
         "Access is denied") 
       ); 

AbstractAccessDecisionManager.accessDeniedは、ローカライズできるメッセージの名前です。

英語の場合には、次のとおりです。上の理由について

AbstractAccessDecisionManager.accessDenied=Access is denied 

あり箱のうち利用可能ないくつかの言語があり、そしてあなたが翻訳を所有することができますが、...

すべてです

、これ以上の情報は、例外。

例外メッセージのローカライズについての詳細情報:

http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#localization

0

私もそのためJIRA課題を作成しました:https://jira.spring.io/browse/SEC-3104

@PreAuthorize, @PostAuthorize, @Secured注釈を設定するためにカスタムメッセージプロパティを指すように、パラメータを持つことができます詳細&よりユーザーフレンドリーな例外メッセージ。

これは、パラメータを指定することによっても行うことができます。 AccessDeniedExceptionを拡張するクラス名を定義して、ユーザーが残りの部分を処理できるようにします。

この方法で、

@PreAuthorize("record.createuser != authentication.getName()")

のような複雑なルールを処理している間は、私たちは

"You cannot process a record that you created.""などの代わりに、"Access is denied"

関連する問題