用于 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 的最佳实践

Flutter Firebase 上传自定义类列表

使用javascript将数据推送到firebase数据库列表中时如何保存对象uid

将新数据推送到firebase数据库时设置自定义数字键