如何在Spring @ExceptionHandler中捕获自定义注释?

时间:2017-10-19 05:20:04

标签: java spring spring-boot spring-security

我有这样的自定义注释:

markForCheck

我将注释放在我的@Retention(RetentionPolicy.RUNTIME) @Inherited @Documented @PreAuthorize(AllowedForSystemUsers.condition) public @interface AllowedForSystemUsers { String condition = "hasAnyRole({'ROLE_ADMIN', 'ROLE_USER'})"; } 方法中,如下所示:

Controller

我的@RequestMapping(value="/search", method=RequestMethod.POST) @AllowedForSystemUsers public String searchRooms(@ModelAttribute Booking booking, Model model, long type) { //do something } 喜欢这样:

ExceptionHandler

因此,如果用户没有@ExceptionHandler(value = AccessDeniedException.class) public ModelAndView accessDenied(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) { return new ModelAndView("redirect:/error"); } ROLE_ADMIN身份验证,则会发生ROLE_USER并且代码会运行到AccessDeniedException方法。

我的问题是如何知道accessDenied()注释是否会触发此@AllowedForSystemUsers?其他代码也可能触发AccessDeniedException

谢谢!

1 个答案:

答案 0 :(得分:1)

系统不应该向用户提供任何提示,为什么他没有被授权。他根本没有被授权。这是一个安全问题。此外,非管理员的用户根本不能在前端调用任何管理操作。这是一个可用性问题。

您需要以下内容(下次在您的问题中包含上下文信息):

  

我希望让用户看到预订按钮,并可以搜索可用的房间   即使他没有登录,但是当他想要预订房间时,他得到了   请先登录第一条消息

这绝对没问题。如果当前未登录的用户按下Book按钮,我必须假设服务器将使用401 HTTP code进行响应。在您的前端,您只需对此响应状态代码作出反应,向用户显示信息,他显然未登录或您想要做什么。绝对没有必要,服务器需要告诉你为什么他用401回复。