我正在尝试创建自己的方法安全表达式,我希望在@PreFilter
和@PostFilter
注释中使用。
搜索教程和类似问题我找到了两种方法。
第一种是扩展DefaultMethodSecurityExpressionHandler
并覆盖createSecurityExpressionRoot
,以便提供自定义的SecurityExpressionRoot
。
@PreAuthorize('isOwner(#someEntity)')
第二种方法是简单地使用@Component类并在@Pre
/ @Post
过滤器中使用@bean.method()
访问其方法
@PreAuthorize("@mySecurityService.isOwner('#someEntityl')")
我的问题是:哪种方式首选?如果两者都可以,为什么选择另一个?
谢谢你 马可答案 0 :(得分:6)
@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
个案件的JUnit测试结合@Post
方式。