我有这样的自定义注释:
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
谢谢!
答案 0 :(得分:1)
系统不应该向用户提供任何提示,为什么他没有被授权。他根本没有被授权。这是一个安全问题。此外,非管理员的用户根本不能在前端调用任何管理操作。这是一个可用性问题。
您需要以下内容(下次在您的问题中包含上下文信息):
我希望让用户看到预订按钮,并可以搜索可用的房间 即使他没有登录,但是当他想要预订房间时,他得到了 请先登录第一条消息
这绝对没问题。如果当前未登录的用户按下Book
按钮,我必须假设服务器将使用401
HTTP code进行响应。在您的前端,您只需对此响应状态代码作出反应,向用户显示信息,他显然未登录或您想要做什么。绝对没有必要,服务器需要告诉你为什么他用401
回复。