【发布时间】: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