唯一の方法は、 validate_doc_update関数と同じ値updated_by
でフィールドを強制することです。userCtx.name
function(newdoc, olddoc, userctx, secobj){
if (newdoc.updated_by != userctx.name)
throw({"forbidden": "`updated_by` field should match real updater user name"})
}
この機能は、すべてのドキュメント(デザインドキュメントを除く)のコンテンツを制御し、期待どおりのデータが必要です。
この時点で停止することもできますが、彼には1つの欠点があります。すべてのクライアントは、このフィールドを手動で設定する必要があります。それは厄介で、彼らに「リラックス」させないでください。この問題を解決するために、CouchDBは更新機能を提供します。これにより、サーバー側でビジネスロジックの一部をセットアップして、クライアントの実現からこの知識を取り除くことができます。したがって、更新関数は次のようになります。
function(doc, req){
if (!doc){ // new doc
doc = JSON.parse(req.body);
}
doc.updated_by = req.userCtx.name;
return [doc, {"json": {"status": "ok"}}
}
updated_by
そして、彼はあなたに正しい方法でフィールドをセットアップさせました。さらに、メタフィールドを追加することでこの機能を拡張できます(たとえばuserCtx.peer
、クライアントIPアドレスを保持します)。クライアントがそれを使用する場合は、メタデータの変更を更新する必要はありません。
ただし、サービスユーザーにいくつかの例外を提供する必要があることに注意してください。そうしないと、validate関数がユーザー名の値とは異なるすべてのドキュメントを拒否するため、CouchDBノード間の複製が壊れupdated_by
ます。