创建自定义方法安全表达式的最佳方法

我正在尝试创建自己的方法安全表达式,我想在@PreFilter@PostFilter注释中使用它。

在搜索教程和类似问题时,我发现了两种方法。

第一种是扩展DefaultMethodSecurityExpressionHandler并覆盖createSecurityExpressionRoot ,以便提供自定义的SecurityExpressionRoot

 @PreAuthorize('isOwner(#someEntity)') 

第二种方法是简单地使用@Component类并在@Pre / @Postfilter中使用@bean.method()访问其方法

 @PreAuthorize("@mySecurityService.isOwner('#someEntityl')") 

我的问题是:哪种方式首选? 如果两者都可以,为什么选择另一个?

谢谢Marco

@PreAuthorize('isOwner(#someEntity)')方式优于@bean.method()方式:

  • 从维护的角度来看:当您更改某些方法(如CustomSecurityExpressionRoot.isOwner()签名时,您很清楚(甚至对于熟悉Spring Security的新开发人员)您需要查看所有@Pre / @Post注释。 如果对所有@Pre / @Post案例进行JUnit测试,这个优势就不那么重要了。
  • 语法短(您可以尝试一些简短的别名来改进@bean.method()方式,例如@sec.isOwner()
  • 使用SecurityExpressionRoot您可以自动访问authenticationtrustResolverrolespermissionEvaluator对象。 它并不那么重要,因为您也可以轻松地将它们放入您的自定义bean中。

@bean.method()方式优于@PreAuthorize('isOwner(#someEntity)')方式:

  • 易于安装

我就像你的@bean.method()方式。 恕我直言,所有的差异都不那么重要(对于我以前的项目)。 但我非常喜欢“简易设置”选项! 因此,对于下一个项目,我将尝试使用@bean.method()方法结合所有@Pre / @Post案例的JUnit测试。