Firestore 安全规则:检查用户是否在被禁用户数组中

firestore security rules: check if user in array of banned users

我有一个用户集合,如下所示:

/users/{userId} 有一个地图数组,例如

blockedUsers: [
  {user: "1", userName: "un1", displayName: "dn1"}, 
  {user: "4", userName: "un4", displayName: "dn4"}
]

为了简化操作,我已经对被禁用户数据进行了非规范化处理。 我正在尝试设置 firestore 规则以防止被禁止的用户回复 banned/blocked 他们的消息。

这是我设置的规则,它不起作用,但我花了很长时间试图解决这个问题,现在转向 Whosebug 寻求帮助。

match /users/{user} {
  allow read: if request.auth != null;
  allow create: if request.resource.id == request.auth.uid;               
  allow update: if request.auth != null && !resource.data.blockedUsers.hasAny[request.auth.uid];
}

更新 这是用户用来回复的客户端代码:

const processNewMessage = async (evt, newMessage) => {
  myMessage.value = myMessage.value.trim();

  if (evt.srcElement.textContent === "send") {
    if (replying.value === true) {
      const message = {
        originalMessage: {
          text: props.selectedMessage.text,
          photoUrl: props.selectedMessage.photoUrl,
        },
        reply: {
          user: uid,
          userDisplayName: auth.currentUser.displayName,
          userName: userName.value,
          text: newMessage,
          createdAt: Timestamp.now(),
          photoUrl: photoUrl,
        },
      };

      await updateDoc(doc(db, `users/${props.selectedMessage.user}`), {
        replies: arrayUnion(message),
      });
    }
  }
}

如果我遗漏了任何必要的信息,请告诉我。

!resource.data.blockedUsers.hasAny[request.auth.uid] 无法工作,因为 blockedUsers 数组是复合对象(或映射)的数组。

object/map { displayName: 'Kamal', uid: 'U4Tuy6676...', userName: 'Kamal' } 不等于字符串 'U4Tuy6676...'.

我建议您复制您的数据并使用另一个仅包含被阻止的 uid 的数组。这比在安全规则中构建地图更容易(我什至不确定您是否可以这样做:据我所知,您将无法从 ID 令牌中获取 userName 值)。