0

JHipster ベースのプロジェクトでは、ログインしているロール/ユーザーに基づいて特定の列を選択的に除外する必要があります。すべてのユーザーはほとんどの列を表示/変更できますが、一部の特権ユーザーのみが特定のセキュアな列を表示/変更できます。フィールド/列。

これを行うための唯一のオプションは、EntityListeners を使用することのようです。EntityListener を使用して、PostLoadイベント中に特定の列をマスクできます。たとえば、列my_secure_columnを XXX でマスクし、ユーザーに表示するとします。

次に、ユーザーは他のフィールド/列 (アクセスできるもの) を変更し、フォームを送信します。イベントで部分的に入力されたエンティティを再度トラップし、データベースからPreUpdate元の値を取得して、my_secure_column永続化する前に設定する必要がありますか?

これはすべて非効率に思えます。数時間探しましたが、このユース ケースに最適な特定の実装を見つけることができませんでした。

編集 1:これは、これをより良い方法で達成するための最初のステップのように見えます。Spring Data JPA で更新クエリを使用してエンティティを更新する

エンティティ全体を常に永続化するのではなく、updateAsUserRole、updateAsManagerRole などの特定の部分的な更新を使用できます。

@Repository
public interface CompanyRepository extends JpaRepository<Company, Integer> {
   @Modifying(clearAutomatically = true)
   @Query("UPDATE Company c SET c.address = :address WHERE c.id = :companyId")
   int updateAddress(@Param("companyId") int companyId, @Param("address") String address);
}
4

1 に答える 1

1

列ベースのセキュリティは簡単に解決できる問題ではなく、特に JPA と組み合わせると問題が大きくなります。

理想的には、列をロードすることさえ避けたいと思っていますが、エンティティを選択しているため、これはデフォルトでは不可能であるため、ロード後に値をオーバーライドして制限されたコンテンツを削除する必要があります。

別の方法として、View Bean (POJO) を作成してから、JPQL Constructor Expressionを使用できます。個人的にはCriteriaBuilder を使用します。JPQLクエリを連結する代わりにconstruct()を使用しますが、原則は同じです。

データの更新に関しては、UI は制限されたフィールドの編集を許可しないようにする必要があります。ただし、バックエンドで検証する必要があります。JPA を呼び出す前に、列が変更されたかどうかを確認することをお勧めします。通常、DTO に変更があり、とにかくエンティティをロードする必要があります。制限された列が変更された場合は、エラーが返されます。このようにして、セキュリティがチェックされた後にのみ JPA を呼び出します。

于 2017-01-06T14:20:07.637 に答える