首页 > 解决方案 > Firestore 安全规则未按预期运行

问题描述

我正在尝试执行以下写入-

guard let userid = Auth.auth().currentUser?.uid else {fatalError()}

        let firstName = "firstName"
        let lastName = "lastName"
        let userName = "userName"
        let uid = userid

        let userInfo = [firstName:firstNameTextField.text!,
                        lastName:lastNameTextField.text!,
                        userName:userNameTextField.text!,
                        uid:userid]

        Firestore.firestore().collection("users").document(userid).setData(userInfo) { (error) in
            if error != nil {
                print(error?.localizedDescription)
            } else {
                self.performSegue(withIdentifier: "goToFeed", sender: self)
            }
        }

这些是我的安全规则 -

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
    }
    match /users/{userid} {
        allow read: if request.auth.uid != null;
        allow create: if request.resource.data.uid == request.auth.uid;

    }
  }
}

当通过 Xcode 模拟器执行此写入时,该写入被拒绝,并出现错误 - “缺少权限或权限不足”。

但是,当我尝试在 Firestore 规则模拟器上构建相同的文档时,它是被允许的。

此外,我还尝试将该规则修改为此

match /users/{userid} {
  allow create: if request.resource.data.uid == request.auth.uid &&
userid == request.auth.uid
}

在上述情况下,Xcode 模拟器和 Firestore 模拟器都拒绝了它。

我究竟做错了什么?

一些澄清 -

  1. 当修改规则以使其成为开放数据库时,写入会完美发生。

  2. 文档结构如下所示 -

let userInfo = [firstName:firstNameTextField.text!,
                      lastName:lastNameTextField.text!,
                      userName:userNameTextField.text!,
                      uid:userid]

标签: firebasegoogle-cloud-firestorefirebase-authenticationfirebase-security

解决方案


推荐阅读