2

spring-data-rest-webmvc 2.0.0.RELEASE と spring-data-jpa 1.5.0.RELEASE を使用しています。

RoomRepository、RoomRepositoryCustom、および RoomRepositoryImpl クラスがあります。

@PostFilter の作業を行うカスタム ロジックを提供できるように、findBy* メソッドをオーバーライドしようとしていますが、ページ分割された結果を返します。

私はもともとこれを 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 に答える