ドキュメントアクセスの制御
読み取り(READ)アクセス制御
Sync Gatewayのクライアントは、(直接またはロールを介して)アクセスが許可されているチャネルに関連付けられたドキュメントにのみアクセスできます。
チャネルは、ドキュメントへの読み取りアクセス制御のみを実施します。(以下で説明する書き込みアクセス制御が行われない限り)ドキュメントにアクセスできるユーザーは誰でも、ドキュメントを更新することができます。
書き込み(WRITE)アクセス制御
ドキュメントの書き込みアクセス制御は、Sync関数内に適切なロジックを実装することのよって実現されます。
Sync Gatewayは、そのために、Sync関数内で利用することのできる、ヘルパー関数を提供しています。
この使用してドキュメントの更新と削除を許可されるユーザーを制御することにより、ドキュメントプロパティレベルで適用できます。
次の例は、ドキュメントの所有者のみが変更を行えるようにするSync関数ロジックを示しています。これは、現在ドキュメントの更新を実行しているユーザーが、そのドキュメントに所有者として記録されているユーザーであるかどうかを確認することによって行われます。
function (doc, oldDoc, meta) {
if (oldDoc) {
requireUser(oldDoc.owner);
}
}
変更を行うユーザーが変更前のドキュメントの所有者でない場合、requireUser
コールで例外がスローされ、更新はエラーにより拒否されます。
ヘルパー関数使用例
Sync関数APIのヘルパー関数の使用例を示します。
次の例は、ユーザー名が「snej」でない場合は例外をスローします
requireUser("snej")
ユーザー名がリストにない場合は例外をスローします
requireUser(["snej", "jchris", "tleyden"])
ユーザーが「admin」ロールを持っていない限り、例外をスローします
requireRole("admin")
ユーザーがロールのいずれかを持っていない限り、例外をスローします
requireRole(["admin", "old-timer"])
ユーザーが「event」チャネルを読み取るためのアクセス権を持っていない限り、例外をスローします
requireAccess("events")
ユーザーがチャネルのいずれかのアクセス権を持っていない限り、例外をスローします
requireAccess(["events", "messages"])
注釈
Sync Gatewayによる同期は、アプリケーションのバックグラウンドプロセスで実施されます。すなわち、Sync関数による検証も、同じタイミングで実行されます。
本質的には、ユーザーは、自身が行ったデータ編集が有効かどうかを意識する必要があり、ドキュメントの保存を実行したタイミングで、無効な操作であることを知るべきだと言えます。
その意味で、Sync関数内での、書き込み権限の検証は、サーバーサイドでのデータの整合性を保証するための手段であり、クライアントサイドで別途検証が行われるべきであると考えることができます。
関連情報