【问题标题】:allow user to write for first attempt in firestore rules允许用户在 Firestore 规则中首次尝试写入
【发布时间】: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(即文档名称)。

标签: android firebase google-cloud-firestore firebase-security


【解决方案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 将在数组不存在时创建它。

    【讨论】:

      猜你喜欢
      • 2020-02-07
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      相关资源
      最近更新 更多