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

仅当Firebase Firestore中不存在文档时创建文档

楚羽
2023-03-14

我试图实现的很简单。只有当数据库不存在时,我才需要在数据库中创建一个用户条目。

应用程序流程:

  1. 使用Firebase身份验证(获取UID)创建用户

客户端代码(创建操作):

this.db.doc('users/' + uid).set({username: Santa})

firestore规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{uid} {
      allow create: if 
        request.auth != null && 
        request.auth.uid == uid && 
        !exists(/databases/$(database)/documents/users/$(uid));
      allow update: if request.auth != null && request.auth.uid == uid; 
    }
  }
} 

附加信息:

正如您可能已经知道的那样,代码不起作用。每次我运行客户端代码时,当前用户都会被一个新文档完全替换。但是,如果我从规则中删除以下行,一切都会正常工作:

allow update: if request.auth != null && request.auth.uid == uid;

但现在问题来了,如何保护用户文档中的数据免受未经授权的修改?有什么建议吗?

共有3个答案

乜华翰
2023-03-14

现在,您可以使用创建方法来完成此操作:

使用提供的对象值创建文档。如果该位置存在文档,则写入操作将失败。

文档参考。创造

还可以更好地处理事务:

创建所提供的DocumentReference引用的文档。如果指定位置存在文档,则操作将使事务失败。

Transaction.create

闾丘选
2023-03-14

在代码中使用逻辑,但不要在规则中使用。将addOnCompleteListener添加到用户集合中,并在获得结果后执行一些操作。

getUsers.document(userUID).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> doc) {
     if(!doc.getResult().exists()){
        //add new user
    }
}                       

}

规则:

match /UsersProfile/{document=**} {
  allow read, write: if request.auth != null;
}
强化
2023-03-14

如果您想仅在文档不存在时才允许创建文档,只需使用您已经拥有的允许创建规则。因为您还有允许更新规则,所以也允许更新存量数据。

以下规则应足够:

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{uid} {
      allow create: if request.auth != null && request.auth.uid == uid;
    }
  }
} 

您不需要存在()调用,因为允许创建仅在数据不存在时适用。

现在到你的问题:你应该明确你的意思。现在只有经过身份验证的用户可以修改自己的记录。如果您不想允许写入任意数据,请检查它。

以下是一些示例:https://firebase.google.com/docs/firestore/security/rules-conditions#authentication

 类似资料:
  • 问题内容: 我希望根据该文件是否已经存在来写一个文件,仅在不存在的情况下才写(实际上,我希望继续尝试文件,直到找到一个不存在的文件为止)。 下面的代码显示在其中一个潜在的攻击者可以插入一个符号,作为建议的方式这篇文章中该文件的测试和写入的文件之间。如果代码以足够高的权限运行,则可能会覆盖任意文件。 有什么办法解决这个问题? 问题答案: 编辑 :另请参见DaveJones的回答:从Python3.3

  • 我是新来的Spring和MongoDB。所以,听到是我想要理解的用例。 在SpringBoot和MongoDB结构中。我试图在Mongo中插入一个新文档,因此在POJO/Domain/Data类中使用了Java文档。现在,我已经编写了代码并启动了服务器。我的问题是,什么时候在MongoDB中创建集合?例如,当启动服务器时(Spring将扫描所有的类,并在创建类时创建集合id DB),或者当调用存储

  • 我有一个具有以下模式的用户集合: 用户将查找用户。名称,必须是唯一的。添加新用户时,我首先执行搜索,如果没有找到这样的用户,我会将新用户文档添加到集合中。搜索用户和添加新用户(如果未找到)的操作不是原子操作,因此,当多个应用程序服务器连接到DB服务器时,可能会同时收到两个具有相同用户名的添加用户请求,从而导致两个添加用户请求都找不到这样的用户,这反过来会导致两个文档具有相同的“user.name”

  • 我想像这样更新文档: 但是,如果doc user\u id不存在,上述代码将抛出错误。因此,如果不存在,如何告诉Firestore创建学生,换句话说,行为如下:

  • 这是我的代码: 每次执行程序时,我都会创建一个新文档,我只想在不存在的情况下创建它,如果文档存在,只需添加内容即可。

  • 我们正在使用cosmosdb记录我们的应用程序日志。我们的日志有两层,一层有一般的信息,另一层有一般日志的更详细的信息。我们还在其他两个集合中记录了这些的副本以供备份。所以我们总共有四个系列。在我们的代码中,我们使用异步CreateDocumentAsync来创建这些日志。我们将任务存储在列表中,并使用Task.waitall来完成所有任务。在开发环境中,我们没有看到任何错误,但在生产中,当创建新