当前位置: 首页 > 知识库问答 >
问题:

经过身份验证的用户电子邮件的 Firestore 数据库规则

晏德佑
2023-03-14

目标:用户应可以访问已登录用户的文档。

集合结构:

> root(collection_name)
    > user1@gmail.com(document_name)
        > "name" : "User One"(field key and value)
    > user2@gmail.com
        > "name" : "User TWO"

我使用的Android代码

db.collection("/root/")
                .get()
                .addOnCompleteListener(task -> {
                    if (task.isSuccessful()) {
                        for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {
                            System.out.println(document.getId() + " => " + document.getData());
                        }
                    } else {
                        System.out.println(task.getException());
                    }
                });

我尝试过的数据库规则:

    service cloud.firestore {
      match /databases/{database}/documents {
        match /root/{email} {
          allow read, update, delete: if request.auth.token['email'] == email;
          allow create: if request.auth != null;
        }
      }
    }
    

我收到的错误:

com.google.firebase.firestore。FirebaseFirestoreException:PERMISSION_DENIED:缺少权限或权限不足。

侦听查询(目标 = 查询(按名称的根顺序);limitType=LIMIT_TO_FIRST) 失败:状态{代码=PERMISSION_DENIED,描述=缺少或权限不足,原因=null}

我也试过用

service cloud.firestore {
  match /databases/{database}/documents {
    match /root/{email} {
      allow read, update, delete: if request.auth!=null;
      allow create: if request.auth != null;
    }
  }
}

上面的规则返回集合中的所有文档,但我只希望它返回登录的特定用户的文档。所以我知道问题在于检查用户的电子邮件。

共有1个答案

祁刚毅
2023-03-14

当您使用以下规则时:

match /root/{email} {
  allow read, update, delete: if request.auth.token['email'] == email;
  allow create: if request.auth != null;
}

这意味着您只允许经过身份验证的用户在您所指向的位置(即用户的文档)读取、更新或删除数据。但是,在代码中,您从整个“根”集合请求数据:

db.collection("/root/").get()

因此,该错误消息。若要解决此问题,请更改代码中的查询,或更改规则。但最有可能的是,您应该使用以下参考来更改获取数据的方式:

db.collection("root").document(userEmail).get().addOnCompleteListener(/* ... /*);
 类似资料:
  • 我已经创建了一个android应用程序,并使用firebase作为电子邮件注册和认证的手段。注册后,用户可以在数据库中存储库存项目。所以我的问题是,如何设置firebase身份验证规则,以便特定用户只能访问他们输入的数据。现在,每个人都可以读/写数据库。我不担心写的部分,因为电子邮件认证。提前感谢! 我的数据库是这样设置的:数据库

  • 如何使用firebase中的验证电子邮件验证使用电子邮件和密码登录的用户?这背后的逻辑是如何工作的,它在代码中会是什么样子? 解决方案/帮助:对于那些仍在寻找答案的人,我找到了这篇文章 堆栈溢出 帖子

  • 我是新的Firebase.我已经建立了一个Firebase实时数据库,如果读写规则设置为true,可以读写它。 我的身份验证有问题。我已经为谷歌和电子邮件加密码设置了身份验证。 我的目标是允许任何用户读取数据,但只有一个用户(我自己)可以在使用单个电子邮件地址和密码登录后写入数据。 如果我用谷歌登录,我可以成功地读写数据库(规则设置为: auth!=null)。 如果使用电子邮件地址和密码登录,我

  • 在本章中,我们将向您展示如何使用Firebase电子邮件/密码身份验证。 创建用户 要对用户进行身份验证,我们可以使用createUserWithEmailAndPassword(email, password)方法。 例子 (Example) 让我们考虑以下示例。 var email = "myemail@email.com"; var password = "mypassword"; fire

  • 我也不会得到一个错误,如果我登录我的电子邮件和密码没有验证电子邮件。 非常感谢你事先的帮助。

  • 我可以在用户注册后发送一封验证邮件,但是用户会自动登录。在用户验证其电子邮件之前,我如何阻止他们登录?