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

时间:2013-07-23 06:59:12

标签: java spring spring-security

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

搜索教程和类似问题我找到了两种方法。

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

@PreAuthorize('isOwner(#someEntity)') 

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

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

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

谢谢你 马可

1 个答案:

答案 0 :(得分:6)

@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个案件的JUnit测试结合@Post方式。