ユーザーの電子メールアドレスに基づいて、ドキュメント自体のドキュメントをユーザーが読み取ることを許可されている場合は、保存します。複数のユーザーが同じ文書にアクセスできる必要があります。マップ値に基づくFirestoreのセキュリティルール
the documentationによると、Firestoreでは配列メンバーの照会が許可されていません。だから私は電子メールアドレスをキーとしてユーザーの電子メールアドレスをString-Bool Mapに保存しているのです。
次の例では、電子メールをマップキーとして使用していません。これは、基本文字列ではすでに機能していないためです。
データベース構造は以下のようになります。
lists
list_1
id: String
name: String
owner: E-Mail
type: String
shared:
test: true
すべてのセキュリティルールがここにリストされています:
service cloud.firestore {
match /databases/{database}/documents {
match /lists/{listId=**} {
allow read: if resource.data.shared.test == true
}
}
}
編集:私はmatch /lists/{listId}
代わりのmatch /lists/{listId=**}
私はそれを理解していますが、shared[test]
の値が真であれば、このセキュリティルールは全員に読み取りアクセスを許可しなければなりません。 completnessの便宜上
:私はセキュリティルールからマップ値にアクセスできないことを推測している
collection.whereEqualTo("shared.test", true).get()
.addOnCompleteListener(activity, { task ->
if (task.isSuccessful) {
Log.i("FIRESTORE", "Query was successful")
} else {
Log.e("FIRESTORE", "Failed to query existing from Firestore. Error ${task.exception}")
}
})
:これは私が使用しているクエリ(Android上Kotlin)があります。だから、私の問題の代替解決策は何でしょうか?
Firestore rules referenceには、resource.data.property == 'property'
のように地図にアクセスできると書かれていますので、間違っていますか?
私がresource.dataで見たすべての例は、**ワイルドカード構文を持っていないので、resource.dataは 'match/lists/{listId}'の代わりに 'match/lists/{listId = **} '?試してみる価値のあるもの。 – Scarygami
いいえ、残念ながらこれもうまくいきません。 –
ええと...私は正直です。これは正常に動作するはずです。誤ってデータを保存したり、Cloud Firestoreの代わりにRealtime Databaseにルールを編集したりしていないことを最初に確認できますか? (これは時々起こります)また、これをクエリにしておらず、個々のドキュメントを取得しようとするとどうなりますか? –