web-dev-qa-db-ja.com

ドキュメントフィールドのFirestoreルール

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セグメントがありますか? ドキュメント はこれについて何も述べていません。

11
Genuanceerd

これを行うには、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;
    }
  }
}
5
Jason Berryman