8

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

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

首先是extendDefaultMethodSecurityExpressionHandler和override createSecurityExpressionRoot,以便给定一个自定义的SecurityExpressionRoot

@PreAuthorize('isOwner(#someEntity)') 

第二种方法是简单地使用 @Component 类和 in @Pre/ @Postfilter 访问它的方法@bean.method()

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

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

谢谢马可

4

1 回答 1

10

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

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

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

  • 易于设置

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

于 2013-07-23T09:22:44.137 回答