Firebase存储uid列表的自定义元数据安全规则

时间:2017-03-07 16:58:18

标签: firebase firebase-security firebase-storage

我正在开发一个消息传递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'和朋友uids'request.auth.uid'访问customMetadata变量?

作为旁注,我假设我添加到customMetadata的密钥数没有限制?

1 个答案:

答案 0 :(得分:5)

所以我设法解决了它。我遇到的问题是我不熟悉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; 
    }