私は単純な CRUD アプリを構築しています (CRUD モジュールを使用していません)。
私のモデルは、1 つの属性を持つ単純なクラスです。ID はモデルから暗黙的に継承されます。
@Entity
public class Account extends Model {
@Required
public String domain;
}
ビューは次のとおりです。id の非表示フィールドに注意してください。
<form class="form-horizontal" action="@{Application.save}" method="POST">
<fieldset>
<legend>Settings</legend>
<input type="hidden" name="account.id" value="${account?.id}">
#{field 'account.domain'}
<div class="control-group #{if field.error != null} error #{/if}">
<label class="control-label" for="${field.id}">&{field.name}</label>
<div class="controls">
<input type="text" class="input-xlarge" id="${field.id}" value="${field.value}" name="${field.name}">
<span class="help-inline">${field.error}</span>
</div>
</div>
#{/field}
<div class="form-actions">
<input class="btn btn-primary" type="submit" value="Save">
</div>
</fieldset>
保存、更新が機能するシナリオを構築できました。
更新の方法は、非表示フィールドから ID を読み取り、レコードを更新することです。ID が利用できない場合、新しいレコードが作成されます。
問題は、ID をハッキング、つまり変更して 1 を 2 に変更できるかどうかです。2 のレコードが存在すると仮定すると、それは上書きされます。(firebug や他のプラグインでは難しくないと思います)。
これを防ぐにはどうすればよいですか?私が考えた1つのオプションは、指定されたIDでレコードを読み取ることです。ユーザーが変更を許可されている場合は更新を許可し、そうでない場合は許可しません。ユーザーが許可されても、「間違った」レコードが変更される可能性があるため、これはまだ確実ではありません。
これは既知の問題であり、うまくいけば既知の解決策があると思います。
私の質問に答えてくれてありがとう。