firebase Firestore安全规则:使用格式错误的路径调用函数[get]

f1tvaqid  于 2023-11-21  发布在  其他
关注(0)|答案(1)|浏览(137)

云Firestore规则

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /admins/{document=**} {
      allow read, write: if true;
    }

    match /{userId}/{document=**} {
      allow read, write: if request.auth.uid == userId || get(/databases/$(database)/documents/$(userId)/users/$(request.auth.token.email)).exists;
    }
  }
}

字符串

详情请参见Cloud Firestore规则Playground
模拟类型:get
位置:/databases/(默认)/documents/cTgy 9 W 6 Zt 2dShSgqig 2 ToeYLEzt 2/products
已验证:True

鉴权负载

{
  "uid": "dQkped8ggvUv6iHfI9kVD7Vrnlf2",
  "token": {
    "sub": "dQkped8ggvUv6iHfI9kVD7Vrnlf2",
    "aud": "undefined",
    "email": "[email protected]",
    "email_verified": false,
    "firebase": {
      "sign_in_provider": "password"
    }
  }
}

错误

Function [get] called with malformed path: /databases/(default)/documents/cTgy9W6Zt2dShSgqig2ToeYLEzt2/users/[email protected]


100d 1xx 1c 1d 1x的字符串

hpxqektj

hpxqektj1#

您需要将Document路径传递给get()方法。
正如文档中所解释的:“get()exists()函数都需要完全指定的文档路径。”

/databases/$(database)/documents/$(userId)/users/$(request.auth.token.email)

字符串
你实际上是在传递一个集合路径(3个元素)。
您需要更改数据模型或在[[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection)子集合中添加要指向的文档。

此外我认为你混淆了get()exists()函数。

get()方法返回一个没有exists属性的rules.firestore.Resource
所以做get(**path**).exists是不行的。你应该使用exists()来检查特定文档是否存在,或者使用get()通过data属性来检查特定文档的字段的值。

相关问题