java - note - spring tutorial




エンティティの関係の変化を防ぐ方法 (3)

まず第一にあなたの要求構造は正しくありません。 このような安全な理由から、あなたは彼のuserid、houseidなどをユーザーに尋ねることができませんでした。ユーザー要求に頼らずにバックグラウンドでそれを扱う必要があります。

しかし、この状況では、単純にselect insertを使ってinsert文を変更することができます。 許可テーブルに参加して、特定のIDが関連ユーザーに添付されていることを確認するためのステートメントを選択します。 何も挿入されていない場合、ユーザーは不正なIDを挿入しようとします。

私は私達のデータベースにJPA経由で複雑なjson構造を格納するためにスプリングブートを使用しています。

json構造体のルートは、 "House"オブジェクトを表します。 "House"オブジェクトはいくつかの "Furnitures"を含みます。 例えば:

House ID: 4711
|- Furniture: ID 4712 (with confidential information)

ユーザーは、特定の住宅、およびすべての "家具"に対する読み取り/書き込み権限を持っています。

私の問題は、ユーザーが主キーを知っていれば、ユーザーはREST-APIを通じて他の家から家具を「盗む」ことができるということです。 このようなリクエストで:

POST http://localhost:8080/house

{
    houseId: 99991337,
    furnitures: [{
        furnitureId: 4712,
        ...
    }]
}

これはにつながります:

House ID: 4711
|- empty!

House ID: 99991337
|- Furniture 4712 (with confidential information)

ユーザはHouse 4711に対する許可を得ていないが、彼はHouse 4711から家具4712を「リンク解除」し、代わりにそれをハウス99991337にリンクさせた。

どのように私は家具の家の変更を禁止することができますか?

JPAエンティティでは、家から家具への双方向のOneToMany-Relationshipがあります。 私は多分データベース内の着信要求の家具を検索し、それらすべてに対するすべての許可をチェックすることを考えました。 しかし、私は家の許可を確認するだけでいいのですが(実生活では、家具のようなもっと多くの実体があるので)


次の文が当てはまる場合:

Yes, a furniture should belong to exactly one house and should be privately be owned by that house. Only those users permitted to see/edit the house should be able to see/edit its furniture.

私の考えでは、それはあなたがすでに他の家に取り付けられている家具で家を作ることを許されるべきではないということを意味します(ビジネス要件)。

家を作成する前に家具が別の家に属していないかどうかを最初に確認し(データの整合性を保持)、存在している場合は例外をスローします。 私はこれがビジネス層で起こっているのを見ます、それはデータ/要件を危うくするかもしれないどんな外部境界呼び出しにも応えるでしょう。

あなたはそれをあなたのビジネス層の外に動かすことができました、しかしその時あなたはあなたがチャンネルごとにコードを複製するか、または1/2チャンネルを逃すかもしれないという可能性があります。


私はあなたがアノテーション@HandleBeforeSave@RepositoryEventHandlerFurnitureエンティティテーブルの更新にハンドラを置くことを試みることができると思います、そしてこのハンドラの中であなたはこのFurnitureエンティティだけを問い合わせることができます。 そして、この更新リクエストをどうするかを決めます。







jpa