当前位置: 首页 > 知识库问答 >
问题:

带有@preauthorize和@@controlleradvice的自定义

赖运珧
2023-03-14

我们正在使用spring和Spring-Security-3.2。最近,我们向RESTAPI添加了注释@preauthorize(以前是基于URL的)。

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

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

是否可能抛出一个包含权限名称的异常,所以最终的错误消息应该是“Access Is denied,you need ViewSalesOrder permission”(这里的权限名称应该来自@preauthorize注释)?

请注意,我们有100个这样的restAPI,所以通用解决方案将高度赞赏。

共有1个答案

邵祺
2023-03-14

由于PermissionEvaluator接口不允许您将丢失的权限与计算结果一起传递,因此没有任何理想的方法可以实现您所期望的结果。
此外,AccessDecisionManager会根据AccessDecisionVoter实例的投票来决定最终授权,其中一个实例是PreInvocationAuthorizationAdviceVoter,它会根据@preauthorize值的计算投票。长话短说,当您的自定义正如您所看到的,无法在此流中传播失败的原因。

另一方面,您可以尝试一些变通方法来实现您想要的目标。一种方法是,当权限检查失败时,在自定义的PermissionEvaluator中引发异常。可以使用此异常将丢失的权限传播到全局异常处理程序。在那里,您可以将缺少的权限作为参数传递给您的消息描述符。注意,这将停止AccessDecisionManager的执行过程,这意味着连续的投票者将不会被执行(默认值是RoleVoter和AuthenticatedVoter)。如果选择沿着此路径前进,则应小心。另一种更安全但更笨拙的方法可以是实现自定义AccessDeniedHandler并在使用403响应之前自定义错误消息。AccessDeniedHandler提供当前的HttpServletRequest,可用于检索请求URI。但是,在这种情况下,坏消息是,您需要一个URI到权限的映射,以便定位丢失的权限。

 类似资料:
  • 我发现有一个老问题sleuth/zipkin用@controlleradvice跟踪,但我在最新版本(spring-cloud-starter-zipkin:2.1.0.release)中遇到了同样的问题,我调试了它,发现错误为null,所以zipkin只是用statuscode猜测。我必须再次抛出异常以使zipkin通知异常 错误为空 zipkin结果 控制器建议 再次抛出异常,它起作用了

  • 我尝试开发一个小android应用程序,并显示一个对话框警报,其中只包含一个edittext,以填充自定义内容作为下一个链接 创建自定义布局我有这个代码,但它不工作 } 但是代码循环运行 我不明白 在我班上的主要活动 我有这个密码 这是我的风格。xml 我的logcat是下一个 谢谢你的帮助,

  • 问题内容: 我必须创建一个将具有圆角,边框,阴影的自定义,其方法被重写以提供自定义绘图代码,并通过该代码将多条直线绘制到视图中(我在这里需要使用快速,轻便的方法,因为许多这些视图中的一个可以呈现)。 我当前面临的问题是,一旦在视图类中进行覆盖(即使其中没​​有任何自定义代码),阴影也将不再适用于圆角。请参见附件中的图片: 在视图控制器中,我使用以下代码: 在覆盖的情况下,我将使用类似: 但是如上所

  • 问题内容: 我正在使用.NET的HttpClient向WebAPI发出请求,该WebAPI返回一些JSON数据,该数据需要在客户端进行一些自定义反序列化。为此,我已经完成了自己的工作,但是我不知道如何让该方法处理转换器的存在。 通过使用读取响应,然后将该字符串传递给,我已经解决了我的问题,但是似乎应该有一个更优雅的解决方案。 这是我的代码: 这是我所能做到的最好的,还是有一些更优雅的方法? 如果需

  • 我创建了一个包含一些基本crud方法的CrudController。这很好用。当我想保护这个控制器时,我可以重写超类中的方法,这很好。然而,我不想仅仅为了安全而重写每个方法。为此,我想在类上使用@Secured或@PreAuthorize。 我使用的是Spring Boot 2.2.2(最新版本)。 示例Crud基类 实现类 预期行为 当一个类被注释为@PreAuthorize或@安全时,我希望所

  • 在Spring Boot控制器中,我使用检查用户是否登录(使用基本auth+)。 但是如果用户没有登录,即他们没有经过身份验证,控制器返回。 根据我对身份验证与授权的了解,用于身份验证,而用于授权。 根据我的理解,总是检查用户的授权(顾名思义),但是有什么方法可以根据我们传递给它的参数自定义它,即? 我知道还有另一种解决方案:在中使用基于URL的安全配置,但如果我不想这样做,该怎么办。 有什么想法