首页 > 解决方案 > @PreAuthorize 停止传播在评估安全检查期间引发的异常

问题描述

我有一个带有多个端点的控制器。每个端点都映射到可以返回 200 或抛出异常的服务,然后对其进行处理并返回正确的错误消息。

例如,如果找不到用户,我会抛出一个UserNotFoundException,然后将其捕获在ControllerAdvisor中,该 ControllerAdvisor将其映射为 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:尝试在类型的对象上执行方法'getUser'时发生问题......

在 ...

原因:UserNotFoundException

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

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

标签: javaspringspring-bootspring-security

解决方案


推荐阅读