実際には、追加時と更新時の両方で「id」フィールドを禁止する必要があります。そうしないと、悪意のあるユーザーが更新リクエストの「id」リクエスト パラメータの値を改ざんし、フォームに示されているレコードとは異なるレコードを更新する可能性があります (ACL やその他のドメイン レベルのセキュリティがない場合)。
ただし、単に「id」フィールドを許可しない場合、コントローラーは ID を null として扱います。これは、挿入時には機能しますが、更新時には機能しません (たとえば、どの永続化メカニズムに応じて、更新ではなく新しいレコードを挿入しようとする場合があります)。使用しています)。そのため、コントローラーがドメイン オブジェクトの編集不可能な値 (ID だけでなく、許可されていないすべてのフィールド) をリクエスト間で記憶して、すべての正しい値をサービス レイヤーまたは他のビジネス ロジックに送信できるようにする必要があります。これは、次のように型レベルの @SessionAttributes アノテーションを使用して行われます (明確にするために他のアノテーションは省略されています)。
@SessionAttributes("thing") // the name of your domain object in the model
public class ThingController {
public void setDisallowedFields(WebDataBinder binder) {
binder.setDisallowedFields("id", "someOtherUneditableField");
}
// request handling methods go here as before
}
セキュリティをさらに強化するには、許可されていないフィールドではなく許可されたフィールドを設定します。いずれにせよ、リクエストから無視される既存のフィールド値を埋めるために @SessionAttributes アノテーションが必要です。