@PreAuthorize停止传播在评估安全检查期间引发的异常



我有一个带有多个端点的控制器。每个终结点都映射到一个服务,该服务可能返回 200 或引发异常,然后进行处理并将返回正确的错误消息。

例如,如果未找到用户,我会抛出一个UserNotFoundException,然后将其捕获在控制器顾问中,该控制器顾问将其映射到 404 未找到。

一切正常,直到我添加了@PreAuthorize。它看起来像这样:

@PreAuthorize("@userController.userService.getUser(#userId).username == authentication.principal.name")

问题是,如果getUser抛出异常,我会得到 500 而不是 404。

堆栈跟踪如下所示:

java.lang.IllegalArgumentException: 无法计算表达式 '@userController.userService.getUser(#userId).username == authentication.principal.name'

在。。。

由以下原因引起:org.springframework.expression.ExpressionInvocationTargetException:尝试在类型为...

在。。。

原因:UserNotFoundException

所以看起来问题是由UserNotFoundException引起的,PreAuthorize实现没有正确地重新抛出。

这看起来像一个典型的场景,但我研究了很多,但没有找到任何解决方案。找不到用户时如何获取我的 404?

在这种情况下,使用@PreAuthorize没有额外的好处。

只需将UserNotFoundException放在业务逻辑中,并将此异常映射到ControllerAdvisor中的404,就像以前一样。

相关内容

  • 没有找到相关文章

最新更新