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

gip*_*ani 6 java spring spring-security

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

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

第一种是扩展DefaultMethodSecurityExpressionHandler和覆盖createSecurityExpressionRoot,以便进行定制SecurityExpressionRoot.

@PreAuthorize('isOwner(#someEntity)') 
Run Code Online (Sandbox Code Playgroud)

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

@PreAuthorize("@mySecurityService.isOwner('#someEntityl')")
Run Code Online (Sandbox Code Playgroud)

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

谢谢Marco

Mak*_*das 6

的优势@PreAuthorize('isOwner(#someEntity)')大大超过@bean.method()方式:

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

的优势@bean.method()大大超过@PreAuthorize('isOwner(#someEntity)')方式:

  • 易于安装

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