java - @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?
解决方案
推荐阅读
- paypal - 带有编码用户 ID 的 PayPal 付款
- mercurial - 构建失败,因为 repo pull 失败,存储库存在或超时等待锁定
- grails - Grails:相同的 URL 映射到每个不同 HTTP 方法的不同操作
- python - 记录鸭子类型的 Python 参数
- json - 使用 Angular 5 在 Mac OS 上下载/导出 json 文件
- android - 为什么 RecyclerView 的平滑滚动不适用于某些 Interpolator 类?
- c# - Kafka主题中有消息时如何触发Azure功能
- html - Angular 5:如何通过 *ngFor 在 html 中显示对象数组
- html - How to process 2 of click events in order in Angular
- macos - 在 influxdb 中编辑 Meta.db