允许用户在 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 函数写入