2

我正在使用带有 spring-data-jpa 1.5.0.RELEASE 的 spring-data-rest-webmvc 2.0.0.RELEASE。

我有一个 RoomRepository、RoomRepositoryCustom 和 RoomRepositoryImpl 类。

我正在尝试覆盖 findBy* 方法,以便我可以提供自定义逻辑来完成 @PostFilter 的工作,但返回分页结果。

我最初在 RoomRespository 中有这个:

@PostFilter("hasPermission(filterObject, '" + FIND + "')")
@RestResource(rel = "byName", path = "byName")
public List<Room> findByName(@Param("name") String name);

它运作良好,但由于@PostFilter 的限制,我必须返回一个列表并且不能返回一个页面。

我想像这样取消@PostFilter:

@RestResource(rel = "byName", path = "byName")
public Page<Room> findByName(@Param("name") String name, Pageable p);

但是我仍然需要按经过身份验证的用户的主体过滤我的结果。(我希望在我的自定义方法中做到这一点)

所以我想我可以通过在 RoomRespositoryImpl 中提供一个实现来覆盖 findByName,但这似乎不能正常工作。如果我尝试覆盖 findByName,则 Spring Data REST 不再选择该方法,并且永远不会为rooms/search/byName?name="test".

我还尝试使用 @Query 为查找器定义自定义查询。它有效,但我不相信它适用于我的目的,因为我需要使用经过身份验证的用户的主体作为查询参数。

总结:如何最好地使用 Spring Data REST 实现 /rooms/search/byName?name="test" 端点,该端点返回名称包含参数的房间页面,但也被我自己的基于自定义逻辑过滤在单独的表中查找当前经过身份验证的用户的权限?

有没有办法在 /rooms/search/* 下添加自定义链接?

4

1 回答 1

2

简而言之:目前不支持(2.0/2.1 版)。就安全性而言,分页是一个相当复杂的野兽,因为@PostFilter如果您在页面加载后从页面中过滤项目,您会创建无效结果,因此这种方法实际上并不奏效。

此问题的正确解决方案需要将安全约束合并到执行的查询中。我们在 Spring Data Commons 中有一张来跟踪此所需的一般基础设施,以及在 Spring Data JPA 中支持软删除的某种相关票,您可能想跟踪该主题的进展。

于 2014-04-22T06:55:01.413 回答