3

我们正在使用 Spring Security 的 ACL Annotations 来允许访问某些 Web 服务。@PreAuthorize并且@PostAuthorize似乎非常有用,并且有利于我们拥有的大多数用例。基于 SPEL 的单个方法等规则正在帮助我们在应用程序及其服务上实现细粒度的安全性。

例如:- 我们检查返回对象的所有者,如下所示

@PreAuthorize("hasRole('ROLE_ADMIN') and returnObject.owner == authentication.name")
public SomeDTO getSomeDTO(){ ... }

当返回单个对象时,这可以正常工作。如果返回一个 List 会是什么等价物?我们如何遍历一个集合并使用 SPEL 检查该集合中的各个元素属性?

4

3 回答 3

2

如果是集合,您应该使用@PreFilter@PostFilter注释。

使用 @PostFilter 注释时,Spring Security 会遍历返回的集合并删除提供的表达式为 false 的任何元素。名称 filterObject 指的是集合中的当前对象。您也可以在方法调用之前使用@PreFilter 进行过滤,尽管这是一个不太常见的要求。

请参阅下面的示例或在此处查找更多详细信息。

@PreAuthorize("hasRole('ROLE_ADMIN')")
@PostFilter("filterObject.owner == authentication.name")
public List<SomeDTO> getAll();
于 2016-05-03T13:58:07.580 回答
1

这取决于您的需求。

如果您打算从结果中过滤掉不允许的对象,则可以使用@PostFilter将过滤掉不匹配元素的注释。示例(filterObject 绑定到响应中的单个列表元素):

@PostFilter("filterObject.owner == authentication.name")
public List<SomeDTO> getAll(){ ... }

如果您打算仅在所有元素都被允许的情况下返回结果,那@PostFilter将无济于事,您可以尝试在注释中使用 SPEL 的hasPermission函数。@PostAuthorizeHas Permission 可以获取任何类型的对象并使用您的自定义实现(您需要编写)逻辑地检查它。例如,您可以参考此示例(第 4 节)

于 2017-05-22T07:00:04.757 回答
0

试试下面的表达式,看看。

@PreAuthorize("hasRole('ROLE_ADMIN') and returnObject.?[owner == authentication.name].size() == returnObject.size()")
public List<SomeDTO> getSomeDTOs(){ ... }

看到这个帖子

于 2016-04-25T10:32:47.830 回答