在我的项目中,我使用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问题是否有任何时间表?
答案 0 :(得分:0)
一种轻量级方法是使用hasPermission()方法并在Controller级别实现自己的“Permission Evaluator”,如果这是一个选项。
-s
这里有更详细的描述:http://www.naturalprogrammer.com/spring-domain-object-security-logged-in-user/