允许用户在 Firestore 规则中首次尝试写入

Posted

技术标签:

【中文标题】允许用户在 Firestore 规则中首次尝试写入【英文标题】:allow user to write for first attempt in firestore rules 【发布时间】:2021-05-14 00:56:05 【问题描述】:

我现在处于一种特殊的情况。我正在实现一个 addFriend 功能。它将用户添加到一个名为“friends”的集合中,该集合包含一个文档 uid,该文档是一个朋友数组 uid。

这是我的文档结构:

我希望用户只编辑他们的数据,所以我有规则:

function isSignedIn() 
      return request.auth != null;
    
 function isUser(userId) 
      return request.auth.uid == userId;
    

match /friends/userId 
    allow read:if isSignedIn();
    allow create:if isSignedIn();
    allow update: if isSignedIn() && isUser(userId);

现在安全漏洞在于创建:任何登录的用户都可以创建,但我应该允许人们创建自己的数据。 我可以通过将传入的文档名称与 uid 进行比较来做到这一点,但我不知道该怎么做。

这是我创建或更新朋友收藏的代码:

FirebaseFirestore.getInstance().collection(FRIENDS).document(FirebaseAuth.getInstance().getUid())
                    .update("friends", FieldValue.arrayUnion(scorecard.getUid()))
                    .addOnCompleteListener(task -> 
                        if (task.isSuccessful()) ;
                        else 
                            Map<String, Object> m = new HashMap();
                            m.put("friends", FieldValue.arrayUnion(scorecard.getUid()));
                            FirebaseFirestore.getInstance().collection(FRIENDS).document(FirebaseAuth.getInstance().getUid())
                                    .set(m);
                        
                    );

【问题讨论】:

我认为您的isUser(userId) 函数也应该适用于create @nVitius 我不能这样做,因为在插入第一个元素时尚未创建 userId(即文档名称)。 【参考方案1】:

我想我已经得到了答案,如果您需要检查传入文档的名称,您可以使用规则

request.auth.uid==request.resource.__name__

您可以进一步查看documentation。

【讨论】:

【参考方案2】:

您绝对可以使用您为 create 方法编写的isUser 函数。

我刚刚在 Firebase 控制台的 Rules Playground 上对此进行了测试:

除非我遗漏了什么,否则我相信这就是你想要做的。

附带说明,如果失败,您不必运行 .update.set。 您可以使用SetOptions.merge 根据文档是否存在进行更新或创建。

Map<String, Object> m = new HashMap();
m.put("friends", FieldValue.arrayUnion(scorecard.getUid());
FirebaseFirestore.getInstance()
  .collection(FRIENDS)
  .document(FirebaseAuth.getInstance().getUid())
  .set(m, SetOptions.merge())

FieldValue.arrayUnion 将在数组不存在时创建它。

【讨论】:

以上是关于允许用户在 Firestore 规则中首次尝试写入的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Firestore 安全规则只允许从 Firebase 函数写入

Firestore 规则:允许使用密码访问文档

使用访问规则中的字段写入 Firestore 时缺少权限或权限不足

Firestore - 云功能 - 获取 uid

小程序中首次获取位置权限失败后,主动引导用户授权方案

Firebase 存储规则在 Firestore 文档上查找数据? [复制]