使用@Preauthorize和@@ControllerAdvice自定义错误消息

2023-11-21

我们正在使用 spring 和 spring-security-3.2。最近我们正在向 RestAPI 添加注释 @PreAuthorize(之前它是基于 URL 的)。

     @PreAuthorize("hasPermission('salesorder','ViewSalesOrder')")
  @RequestMapping(value = "/restapi/salesorders/", method = RequestMethod.GET)
  public ModelAndView getSalesOrders(){}

我们已经有了用 - @ControllerAdvice 注释的全局异常处理程序和自定义 PermissionEvaluator,除了错误消息之外,一切正常。

假设某个用户正在访问 API,但没有“ViewSalesOrder”权限,那么 spring 默认会抛出异常“访问被拒绝”,但没有告诉缺少哪个权限(我们要求提及缺少哪个权限)。

是否可以抛出还包含权限名称的异常,因此最终的错误消息应类似于“访问被拒绝,您需要 ViewSalesOrder 权限”(此处权限名称应来自 @PreAuthorize 注释)?

请注意,我们有 100 个这样的 REST API,因此通用解决方案将受到高度赞赏。


没有很好的方法可以实现您的期望,因为PermissionEvaluator接口不允许您将缺少的权限与评估结果一起传递。
此外,AccessDecisionManager就股东大会的投票结果作出最终授权决定AccessDecisionVoter实例,其中之一是PreInvocationAuthorizationAdviceVoter就评估进行投票@PreAuthorize value.

长话短说,PreInvocationAuthorizationAdviceVoter当您的自定义PermissionEvaluator回报false to hasPermission称呼。如您所见,无法传播此流程中的失败原因。

另一方面,您可以尝试一些解决方法来实现您想要的目标。

一种方法是在您的自定义中引发异常PermissionEvaluator当权限检查失败时。您可以使用此异常将缺少的权限传播到全局异常处理程序。在那里,您可以将缺少的权限作为参数传递给消息描述符。请注意,这将停止执行过程AccessDecisionManager这意味着连续的投票者不会被处决(默认是角色投票者 and 认证选民)。如果您选择走这条路,您应该小心。

另一种更安全但更笨拙的方法是实施自定义拒绝访问处理程序并在响应 403 之前自定义错误消息。AccessDeniedHandler为您提供当前的HttpServletRequest可用于检索请求 URI。然而,在这种情况下,坏消息是,您需要一个 URI 到权限映射才能找到丢失的权限。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用@Preauthorize和@@ControllerAdvice自定义错误消息 的相关文章

随机推荐

  • AutoFixture:模拟方法不返回冻结实例

    我正在尝试编写这个简单的测试 var fixture new Fixture Customize new AutoMoqCustomization var postProcessingAction fixture Freeze
  • C#:Dictionary 如何在没有 Add(KeyValuePair) 的情况下实现 ICollection> ?

    看着System Collections Generic Dictionary
  • CocoaPods 找不到 pod“GTMSessionFetcher/Core”的兼容版本

    我正在制作一个 React Native 移动应用程序 并希望合并 Firebase 和 Firebase 身份验证 但是 当我运行 pod install 或 pod update 时 我遇到此错误 我做了一些研究 发现这个问题还没有被谷
  • Cocos2d-x android无法解析cocos2dx库

    我从 macOS xcode 4 5 开始 我尝试过教程 使用cocos2dx完成macOSX的构建 问题发生在android源中 没有描述cocos2dxActivity的内容 所以 org cocos2dx lib不是其他文件 安卓没有
  • 扩展高度以包含绝对定位的儿童

    我正在为 CMS 构建 html javascript 主题设计器 元素是绝对定位的 可以通过鼠标移动 调整大小 和 或包含可编辑文本 其高度可以由行数确定 然而 我遇到了一个问题 即父元素的高度不会扩展以包含其绝对定位的子元素 最少的代码
  • 更改摩卡的默认超时

    如果我们有一个单元测试文件 my spec js 并使用 mocha 运行 mocha my spec js 默认超时为 2000 毫秒 可以使用命令行参数覆盖它以进行部分测试 mocha my spec js timeout 5000 是
  • 如何使用 Azure Blob 存储 SDK 将 Blob 从一个容器复制到另一个容器

    我一直在参考文档https learn microsoft com en us azure storage blobs storage quickstart blobs python 我无法找到将文件从一个容器复制 移动到另一个容器的正确
  • Swift 进度指示器图像蒙版

    首先 该项目是使用 Swift 构建的 我想创建一个自定义进度指示器 在脚本运行时 填满 该脚本将调用从远程服务器拉取的 JSON 提要 为了更好地形象化我所追求的 我做了这个 我的猜测是有两个 PNG 图像 一白一红 然后根据进度量简单地
  • 计算值用 R 改变符号的次数

    我对 R 还很陌生 但我对它很感兴趣 因为我发现它很容易使用 尽管我不是程序员 我试图解决以下问题 我需要计算列中值更改符号的次数 然后按路径对结果进行排序 下面是表格的示例 路径是一个因素 一旦我最终得到数据 我就可以计算出如何对数据进行
  • 在 Spring 应用程序的事务中使用 Async

    我有一个 Spring 应用程序 它使用以下命令更新 MySQL DB 中的特定实体详细信息 Transactional方法 并且在同一方法中 我尝试使用调用另一个端点 Async这是另一个 Spring 应用程序 它从 MySql DB
  • 如何使用ArrayList的get()方法

    我是 java 新手 也是 OOP 新手 我正在尝试了解 ArrayList 类 但我不明白如何使用 get 我尝试在网上搜索 但找不到任何有用的东西 这是官方文档ArrayList get 无论如何 这很简单 例如 ArrayList l
  • 加载图像时显示加载图标

    我想在 a 中显示背景图像 加载微调器div这将在其中加载图像 图像将在完全加载后显示 执行如下操作 div style background image none div 演示 jQuery 中 我如何使用 Angular2 Ionic2
  • 如何在 VBA 应用程序中隐藏代码

    Is it possible to hide VBA code normally accessible from Excel s VBA Editor Alt F11 from a user s prying eyes Can I for
  • 将数字四舍五入到前 3 位数字(以数字 != 0 开头)

    是否有一个预定义的格式函数可以将数字四舍五入到前 3 位数字 开头应该是数字 0 0 02528498 to 0 0253 1 857403 to 1 86 2060943 to 2060000 0 00006513832 to 0 000
  • 未加密的 SSL 协议?

    是否可以通过未加密的 https 发送消息 例如 要求进行证书验证和授权 但不加密通过套接字发送的实际数据 是的 TLS 和 SSL 支持 无加密 模式 所讨论的特定客户端和服务器是否配置为启用是一个单独的问题 服务器有可能默认启用这些密码
  • 将函数应用于 Spark DataFrame 的每一行

    我使用的是 Spark 1 3 我想对数据框的每一行应用一个函数 该函数对行的每一列进行哈希处理并返回哈希值列表 dataframe map row gt row toSeq map col gt col hashCode 当我运行此代码时
  • Visual Studio:重新启用“构建失败,运行上次成功?”对话框

    当构建失败时 VS 会弹出一个选项来运行上次成功的构建 有人在我的机器上单击了 是 和 不再显示此对话框 现在我仍坚持该设置 我怎样才能重置它 流程如下Visual Studio 2010及以上 但与以前的版本应该类似 在菜单栏上转到 To
  • 使用 Update 且 Upsert 为 true 时未设置默认值

    我为用户提供以下模型 var UserSchema new mongoose Schema name String dob Date sex String photo String email type String index uniqu
  • boost::interprocess::shared_ptr 线程安全(和进程间安全)吗?

    我想在线程之间共享数据 并在最后一个用户使用完数据后自动删除数据 大多数时候 这似乎有效 使用boost interprocess shared ptr in a boost fixed managed shared memory段 但并非
  • 使用@Preauthorize和@@ControllerAdvice自定义错误消息

    我们正在使用 spring 和 spring security 3 2 最近我们正在向 RestAPI 添加注释 PreAuthorize 之前它是基于 URL 的 PreAuthorize hasPermission salesorder