用于 uid 列表的 Firebase 存储自定义元数据安全规则
Posted
技术标签:
【中文标题】用于 uid 列表的 Firebase 存储自定义元数据安全规则【英文标题】:Firebase Storage Custom metadata security rule for list of uids 【发布时间】:2017-07-27 23:54:00 【问题描述】:我正在开发一个消息 ios 应用程序,用户可以在其中向多个人发送相同的消息。消息保存在 Firebase 存储中。我只想使已发送消息的用户能够从存储中读取它。我已经在我的 firebase 数据库中实现了这个规则结构。
为了实现这一点以进行存储,我在消息文件 customMetadata 中添加了一个 uid 列表,其中包括编写消息的人的 fromUid 键。我在我的 iOS 应用中执行以下操作:
var metadataValues = [String:String]()
for friendUid in friendsSelected.keys
metadataValues.updateValue(friendUid, forKey: friendUid) // how do I access these values in my security rules
metadataValues.updateValue(senderUid, forKey: "fromUid") // how do I access this in security rules
let messageMetadata = FIRStorageMetadata()
messageMetadata.customMetadata = metadataValues
这是我对 Firebase 存储中消息节点的读写安全规则的尝试,但它不起作用,文档也没有帮助。
match /messages/messageId
allow read: if request.auth.uid == resource.metadata.request.auth.uid; // I want all friend uids to be able to read file
allow write: if request.auth.uid == resource.metadata.fromUid; // only the person who create the message can access it
我的尝试不起作用。如何在我的安全规则中使用键“fromUid”和好友 uid“request.auth.uid”访问 customMetadata 变量??
作为旁注,我假设我添加到 customMetadata 的键的数量没有限制?
【问题讨论】:
非常感谢您对此的帮助。由于某种原因,我尝试过的一切都没有奏效。 【参考方案1】:所以我设法解决了它。我遇到的问题是我不熟悉 javascript,所以我弄错了语法。在研究了 Javascript 之后,我很快就能解决它。
希望我的回答对其他人有所帮助,但如果您与我处于类似的位置,建议您学习 Javascript 的基础知识。
还值得注意的是,要访问文件元数据,您在执行写入之前使用 request.resource.metadata
并在上传后使用 resource.metadata
访问。
match /messages/messageId
allow write: if request.resource.metadata['fromUid'] == request.auth.uid;
allow read: if resource.metadata[request.auth.uid] == request.auth.uid;
【讨论】:
你有没有弄清楚元数据是否有朋友数量的限制? 有点晚了,但我偶然发现:“所有自定义元数据键和值的最大组合大小限制为每个对象 8 KiB。” cloud.google.com/storage/quotas#objects 所以限制是大约 250 个使用标准 uid 的朋友。以上是关于用于 uid 列表的 Firebase 存储自定义元数据安全规则的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Firebase 检索数据到 ListView(使用自定义数组适配器)
Flutter / Dart / Firebase - 流返回空列表
基于 Facebook Id 检索 Firebase uid 的最佳实践