Firestore内でドキュメントのセキュリティルールを設定するのに苦労しています。 RTDBを使用すると、特定のオブジェクトプロパティにルールを設定することが可能でした。Firestoreでも同じことをしようとしています。
RTDBコード:
"users": {
".read": true,
".indexOn": ["profile/name"],
"$uid": {
".read": "auth != null",
".write":
"$uid === auth.uid && !data.exists()",
"profile": {
"birthday": {
".write": "$uid === auth.uid"
},
"name": {
".write": "$uid === auth.uid"
},
"banned": {
".write": "root.child('admins').child(auth.uid).exists()"
}
}
}
}
Firestoreの同じコードの下:
service cloud.firestore {
match /databases/{database}/documents {
match /users/ {
allow read
match /{$user} {
allow read: if request.auth.uid != null
allow write: if request.auth.uid == request.resource.id && exists(/databases/$(database)/documents/users/$(request.resource.id)) === false
match /birthday {
allow write: if request.auth.uid == request.resource.id
}
match /name {
allow write: if request.auth.uid == request.resource.id
}
match /banned {
allow write: get(/databases/$(database)/documents/users/$(request.auth.uid)).data.userType > 3
}
}
}
}
}
サブコレクションのセキュリティルールを作成しているときは、正常に機能しています。しかし、ドキュメントフィールドでは機能しません。これは不可能ですか、または一致参照に特別なpath
セグメントがありますか? ドキュメント はこれについて何も述べていません。
これを行うには、request.resource.data
プロパティ。 ドキュメント のこのセクションに示されているように。ドキュメントレベルを一致させるだけです。 if
条件でフィールドルールをチェックします。
ただし、個々のフィールドへの読み取りアクセスを制御することはできません。ユーザーは文書全体を読むことも読むこともできません。プライベートデータを保存する必要がある場合は、これをユーザードキュメントのサブコレクションに追加することを検討してください。
ここに例があります
service cloud.firestore {
match /databases/{database}/documents {
// Make sure all cities have a positive population and
// the name is not changed
match /cities/{city} {
allow update: if request.resource.data.population > 0
&& request.resource.data.name == resource.data.name;
}
}
}