在Spring Data存储库中包含域对象安全性@PostFilter可分页端点

时间:2016-10-27 09:01:35

标签: spring-security spring-data spring-data-rest spring-security-acl

在我的项目中,我使用Spring-Data,Spring-Data-Rest和Spring-Security。

我需要完成的是在这些存储库上实现域对象安全性(ACL)。具体@PostFilter超过Pageable.findAll()方法。

方法级安全性很容易实现,如here所示。

有关使用@Query here安全表达的文档中还有一节。

但是虽然我也可以在hasPermission(..)中使用@Query方法,但是没有办法在这个方法中包含对象(SQL行) - 具体这样做:

@Query("select u from #{#entityName} u where 1 = ?#{security.hasPermission(u, 'read') ? 1 : 0}")

现在我明白这与修改查询预执行不同,如下所示:

@Query("select m from Message m where m.to.id = ?#{ principal?.id }")

我还发现了以下jira问题: https://jira.spring.io/browse/DATACMNS-293 我怀疑,一旦它得到解决,将有一个解决方案,但它似乎不会很快就会出现。

我仍然需要实现此功能,为此我想获得您的输入和指示可能的解决方案。

现在我正在考虑创建我的自定义注释,它将模仿@PostFilter并使用相同的语法,但将在我自己的BaseRepositoryImplementation中手动调用。在那里,我将从类型和Repositories#getRepositoryInformationFor(type)#getRepositoryInterface()获取存储库接口,找到相应方法的注释并手动调用安全检查。

您可能有不同的解决方案,或者有关我提出的解决方案的一些注意事项吗?

你也碰巧知道上述jira问题是否有任何时间表?

1 个答案:

答案 0 :(得分:0)

一种轻量级方法是使用hasPermission()方法并在Controller级别实现自己的“Permission Evaluator”,如果这是一个选项。

-s

这里有更详细的描述:http://www.naturalprogrammer.com/spring-domain-object-security-logged-in-user/