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

8
我正在尝试创建自己的方法安全表达式,并希望在@PreFilter@PostFilter注释中使用。通过搜索教程和类似的问题,我找到了两种方法。
第一种方法是扩展DefaultMethodSecurityExpressionHandler并重写createSecurityExpressionRoot,以获得自定义的SecurityExpressionRoot
请注意保留HTML标记。
@PreAuthorize('isOwner(#someEntity)') 

第二种方法是简单地使用一个@Component类,在@Pre / @Post过滤器中使用@bean.method()访问其方法。
@PreAuthorize("@mySecurityService.isOwner('#someEntityl')")

我的问题是:哪种方法更受欢迎?如果两种方法都可以,为什么选择其中一种而不是另一种?
谢谢 马可
1个回答

10
< p > @PreAuthorize('isOwner(#someEntity)')的优势胜过@bean.method()的方法:

  • 从维护角度来看:当您更改某个方法的签名,例如CustomSecurityExpressionRoot.isOwner()时,您可以清楚地知道(即使是对于熟悉Spring Security的新开发人员),您需要查看所有@Pre / @Post注释。如果您对所有@Pre / @Post案例都有Junit测试,则此优势并不重要。
  • 短语法(您可以尝试一些简短的别名来改进@bean.method()的方法,例如@sec.isOwner()
  • 通过SecurityExpressionRoot,您自动可以访问身份验证、信任解析器、角色、权限评估器对象。这不是很重要,因为您也可以在您的自定义bean中轻松获取它们。

@bean.method()的优点胜过@PreAuthorize('isOwner(#someEntity)')的方法:

  • 易于设置

我喜欢你的@bean.method()的方法。对于我的以前的项目,我认为所有的区别都不太重要。但是我非常喜欢“易于设置”的选项!因此,对于下一个项目,我将尝试在所有@Pre / @Post案例都有JUnit测试的情况下使用您的@bean.method()方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接