2017-07-12 3 views
5

私たちはspring-security-3.2を使用しています。最近RestAPIに@PreAuthorizeアノテーションを追加しています(以前はURLベースでした)。@Preauthorizeと@@ ControllerAdviceのカスタムエラーメッセージ

 @PreAuthorize("hasPermission('salesorder','ViewSalesOrder')") 
    @RequestMapping(value = "/restapi/salesorders/", method = RequestMethod.GET) 
    public ModelAndView getSalesOrders(){} 

我々はすでにで注釈を付け、グローバル例外ハンドラ持っている - すべては、エラーメッセージを除いて正常に動作し、所定の位置に@ControllerAdviceとカスタムPermissionEvaluatorを。

「ViewSalesOrder」アクセス権を持たない瞬間に、デフォルトでは「アクセスが拒否されました」という例外がスローされますが、どのアクセス権が失われているかはわかりませんでした不足している)。

アクセス権が拒否され、ViewSalesOrder権限が必要です(ここではアクセス権名は@PreAuthorizeアノテーションから取得する必要があります)ように、アクセス権名も含む例外をスローすることは可能ですか?

一般的な解決策が高く評価されるように、このようなrestAPIが100個あることにご注意ください。

答えて

0

PermissionEvaluatorインターフェイスでは、評価の結果とともに不足しているアクセス許可を渡すことができないため、あなたが期待していることを達成するための方法はありません。
さらに、AccessDecisionManagerは、AccessDecisionVoterインスタンスの投票に関する最終承認を決定します。そのうちの1つは、@PreAuthorizeの評価に関して投票するとPreInvocationAuthorizationAdviceVoterです。

あなたのカスタムPermissionEvaluatorfalseからhasPermissionに返ってきたときに、長めの短い、PreInvocationAuthorizationAdviceVoterの投票(リクエスト-1ポイントを与える)ご覧のように、このフローの失敗の原因を伝播する方法はありません。

一方、あなたが望むことを達成するためのいくつかの回避策を試すことがあります。

許可チェックが失敗した場合、PermissionEvaluatorというカスタムで例外をスローすることができます。この例外を使用して、欠落している権限をグローバル例外ハンドラに伝播できます。ここで、不足しているアクセス権をパラメータとしてメッセージ記述子に渡すことができます。これにより、連続した投票者が実行されないことを意味するAccessDecisionManagerの実行プロセスが停止することに注意してください(デフォルトはRoleVoterAuthenticatedVoter)。あなたがこの道を下ることを選ぶなら、あなたは注意するべきです。

もう1つ、より安全だが不器用な方法は、カスタムAccessDeniedHandlerを実装し、403で応答する前にエラーメッセージをカスタマイズすることができます。AccessDeniedHandlerは現在のHttpServletRequestを使用してリクエストURIを取得できます。しかし、この場合の悪いニュースは、不足している権限を見つけるためにURIから権限へのマッピングが必要なことです。

関連する問題