Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建自定义方法安全表达式的最佳方法_Java_Spring_Spring Security - Fatal编程技术网

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

Java 创建自定义方法安全表达式的最佳方法,java,spring,spring-security,Java,Spring,Spring Security,我正在尝试创建自己的方法安全表达式,希望在@PreFilter和@PostFilter注释中使用 在搜索教程和类似问题时,我找到了两种方法 第一个是扩展DefaultMethodSecurityExpressionHandler并重写createSecurityExpressionRoot,以便提供定制的SecurityExpressionRoot @PreAuthorize('isOwner(#someEntity)') 第二种方法是简单地使用@Component类,并在@Pre/@Pos

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

在搜索教程和类似问题时,我找到了两种方法

第一个是扩展
DefaultMethodSecurityExpressionHandler
并重写
createSecurityExpressionRoot
,以便提供定制的
SecurityExpressionRoot

@PreAuthorize('isOwner(#someEntity)') 
第二种方法是简单地使用@Component类,并在
@Pre
/
@Post
过滤器中使用
@bean.method()

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

多谢各位
Marco

预授权('isOwner(#someEntity')的优点远远超过
@bean.method()
方式:

  • 从维护的角度来看:当您更改某些方法(如
    CustomSecurityExpressionRoot.isOwner()
    )的签名时,您(甚至对于一些熟悉Spring安全性的新开发人员)显然需要查看所有
    @Pre
    /
    @Post
    注释。如果您对所有
    @Pre
    /
    @Post
    案例都进行JUnit测试,那么这一优势就不那么重要了
  • 短语法(您可以尝试一些短别名来改进
    @bean.method()
    方式,例如
    @sec.isOwner()
  • 使用
    SecurityExpressionRoot
    您可以自动访问
    身份验证
    信任解析程序
    角色
    权限评估器
    项目。这并不重要,因为您也可以在自定义bean中轻松获得它们
@bean.method()
优于
@PreAuthorize('isOwner(#someEntity'))
方式:

  • 简易安装
我喜欢你的
@bean.method()
方式。IMHO所有的差异都不是那么重要(对于我以前的项目)。但我非常喜欢“轻松设置”选项!因此,对于下一个项目,我将尝试您的
@bean.method()
方法,并结合JUnit测试对所有
@Pre
/
@Post
案例进行测试

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