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
值)。
我有一个用户集合,如下所示:
/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
值)。