2017-10-19 12 views
-2

私はこのようなカスタムアノテーションを持っている:Spring @ExceptionHandlerでカスタムアノテーションをキャッチするには?

@Retention(RetentionPolicy.RUNTIME) 
@Inherited 
@Documented 
@PreAuthorize(AllowedForSystemUsers.condition) 
public @interface AllowedForSystemUsers { 
    String condition = "hasAnyRole({'ROLE_ADMIN', 'ROLE_USER'})"; 
} 

をし、私はこのような私のController方法で注釈を入れて:だから

@ExceptionHandler(value = AccessDeniedException.class) 
public ModelAndView accessDenied(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) { 

    return new ModelAndView("redirect:/error"); 
} 

とき:このような

@RequestMapping(value="/search", method=RequestMethod.POST) 
@AllowedForSystemUsers 
public String searchRooms(@ModelAttribute Booking booking, Model model, long type) { 

    //do something 
} 

マイExceptionHandlerユーザーがROLE_ADMINまたはROLE_USERのような認証を持っていない場合、AccessDeniedExceptionが発生し、方法はaccessDenied()に進みます。

質問@AllowedForSystemUsers注釈がこのAccessDeniedExceptionをトリガーするかどうかは私の質問です。他のコードにも手を加えることがあります。AccessDeniedException

ありがとう!

+0

コントローラに例外を投げる必要があります。グローバル例外ハンドラを実行するには、他の場所から例外をスローする必要があります。 –

+0

'AccessDeniedException'のサブクラスを作成し、' @ AllowedForSystemUsers'処理中にそれをスローすることが考えられます –

+0

@SungJinSteveYoo? – YOUNG

答えて

1

システムがユーザーにヒントを与えてはならない理由、なぜ彼が権限を与えられていないのか。彼は単に許可されていません。これはセキュリティ上の問題です。さらに、管理者ではないユーザは、フロントエンドで管理アクションを全く呼び出すことができないはずです。これはユーザビリティの問題です。私は、ユーザーが予約ボタンを参照して でも、彼はログインしていない利用可能なお部屋を検索することができます聞かせたい

、しかしとき、彼は:

は、次の(コンテキスト情報あなたの質問内の次の時間を含めて)したいです部屋を予約したいのですが、 のように最初のメッセージを入力してください。

これはまったく問題ありません。現在ログインしていないユーザーがBookボタンを押している場合は、サーバが401 HTTP codeで応答すると仮定する必要があります。フロントエンドでは、ユーザーに情報が表示されているか、ログインしていないか、何をしたいかを示すことで、この応答ステータスコードに反応します。あなたがなぜ401と答えたのかをサーバーがあなたに伝える必要があるということはまったく必要ありません。

関連する問題