web-dev-qa-db-ja.com

Firestoreセキュリティルールは参照が存在するかどうかをチェックします

ドキュメントの値が別のドキュメントへの参照であり、ドキュメントがFirebaseセキュリティルールを使用して存在するかどうかを確認する方法を知りたいのですが。

私が試したこと:

function validate(document) {
    return exists(document.reference)
}

match /collection/{document} {
    allow read: if request.auth != null;
    allow create, update: if isAdmin(request.auth.uid) && validate(request.resource.data);
}

これはうまくいかなかったので、document.refのタイプを理解しようとしました。残念ながら、ここにリストされているタイプはありません: https://firebase.google.com/docs/firestore/reference/security/?authuser=0#data_types

pathを試してみました。これは、作業する最も明白なものであるためです。うまくいくとは思っていませんでした。別の推測は、おそらくmapまたはstringでした。どちらも正しくありませんでした。

これが何であるかについての手掛かりがなく、参照をパスに変換する方法が文書化されていないため、ここで質問する必要があります。

誰かがこれに対する解決策を見つけましたか?

TL; DR:

ドキュメントに保存されている参照が存在し、データベースに存在するかどうかをFirestoreセキュリティルールを使用して確認する必要があります。

ありがとう、デニス

14

この行では:

allow create, update: if isAdmin(request.auth.uid) && validate(request.resource.data)

「request.resource.data」を呼び出す代わりに、単に「resource.data」を呼び出す必要があります。

allow create, update: if isAdmin(request.auth.uid) && validate(resource.data)

前述のように、リソース変数はFirestoreドキュメントを表す here ですが、「 request "変数はそのパスで行われるリクエストを表すため、実際の値に関する情報は含まれていません。ドキュメント。

試してみて、うまくいかない場合はお知らせください。

5
Gerardo

exists() documentation によると:

提供されるパスは/databases/$(database)/documentsで始まる必要があります。

したがって、検証関数を次のように変更する必要があります。

function validate(document) {
    return exists(/databases/$(database)/documents/$(document.reference))
}