我试图实现的很简单。只有当数据库不存在时,我才需要在数据库中创建一个用户条目。
应用程序流程:
客户端代码(创建操作):
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;
但现在问题来了,如何保护用户文档中的数据免受未经授权的修改?有什么建议吗?
现在,您可以使用创建方法来完成此操作:
使用提供的对象值创建文档。如果该位置存在文档,则写入操作将失败。
文档参考。创造
还可以更好地处理事务:
创建所提供的DocumentReference引用的文档。如果指定位置存在文档,则操作将使事务失败。
Transaction.create
在代码中使用逻辑,但不要在规则中使用。将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;
}
如果您想仅在文档不存在时才允许创建文档,只需使用您已经拥有的允许创建
规则。因为您还有允许更新
规则,所以也允许更新存量数据。
以下规则应足够:
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来完成所有任务。在开发环境中,我们没有看到任何错误,但在生产中,当创建新