创建自定义方法安全表达式的最佳方法
我正在尝试创建自己的方法安全表达式,我想在@PreFilter
和@PostFilter
注释中使用它。
在搜索教程和类似问题时,我发现了两种方法。
第一种是扩展DefaultMethodSecurityExpressionHandler
并覆盖createSecurityExpressionRoot
,以便提供自定义的SecurityExpressionRoot
。
@PreAuthorize('isOwner(#someEntity)')
第二种方法是简单地使用@Component类并在@Pre
/ @Post
filter中使用@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
您可以自动访问authentication
,trustResolver
,roles
,permissionEvaluator
对象。 它并不那么重要,因为您也可以轻松地将它们放入您的自定义bean中。
@bean.method()
方式优于@PreAuthorize('isOwner(#someEntity)')
方式:
- 易于安装
我就像你的@bean.method()
方式。 恕我直言,所有的差异都不那么重要(对于我以前的项目)。 但我非常喜欢“简易设置”选项! 因此,对于下一个项目,我将尝试使用@bean.method()
方法结合所有@Pre
/ @Post
案例的JUnit测试。