Firebase规则,为邮件的收件人提供读取权限

时间:2017-01-30 12:12:46

标签: angular firebase ionic2 firebase-security angularfire2

我正在尝试使用Ionic 2 + angularFire2制作移动应用程序。

基本上我的数据库将包含用户和消息。用户将通过电子邮件和密码进行身份验证。

用户将通过以下方式交换消息:

  1. 搜索收件人电子邮件是否有效/已注册
  2. 将邮件发送给收件人
  3. 收件人
  4. 的信息仅 可读

    示例数据:

    "messages" : {
        // message key
        "-KbUpdXdFT6ggEqCXDd5" : {
            "data" : "Lorem Ipsum",
            "recipient" : "john.doe@gmail.com",
            "sender" : "bill.doe@gmail.com"
        },
        "-KbUr1_8AakzKjdwfmny" : {
            "data" : "Some message",
            "recipient" : "john.doe@gmail.com",
            "sender" : "bill.doe@gmail.com"
        },
    }
    "users": {
        // users key
        "OpYYjG3iJsprgPNmhrNZ: {
            "email": "john.doe@gmail.com"
        },
        "bwEd48upa0e7h5ghKEpo":{
            "email": "bill.doe@gmail.com"
        }
     }
    

    示例规则:

    "rules": {
        "messages":{   
            // everyone is allowed to write new messages
            ".write": "auth != null",            
            "$message": {
                // read only if you are an authenticated user and your email is the same as the recipient 
                ".read": "auth != null && data.child('recipient').val() == auth.token.email"
         },
         "users":{
             ".read": "auth != null"         
         }   
     }
    

    设置规则后,用户John Doe会调用此查询来获取收到的消息列表:

    messages = this.af.database.list('messages',{
            query:{
                orderByChild: 'recipient',
                equalTo: "john.doe@gmail.com"
            }
        });
    

    问题: 我一直得到"客户没有权限访问所需的数据。"错误。

    我猜它与某些事情有关:

    ".read": "auth != null && data.child('recipient').val() == auth.token.email"
    

    我尝试了其他各种规则,但没有成功。甚至考虑采用更嵌套的设计,消息在用户之下但似乎被认为是反模式。

    欢迎任何帮助,建议或教程!谢谢!

1 个答案:

答案 0 :(得分:0)

您的问题与广泛讨论的主题有关:

Firebase规则不是过滤器。

最重要的是,您无法使用规则来过滤您想要的方式,如果您有权访问节点的一个子节点而不是其兄弟节点,则在尝试读取父节点时会出错。

请参阅:Documentation

<强>解决方案 一种解决方案是将结构更改为如下所示:

"messages" : {
    // Each recipient has his own child node
    "user-id-of-john-doe" : {
        "KbUpdXdFT6ggEqCXDd5" : {
            "data" : "Lorem Ipsum",
            "recipient" : "john.doe@gmail.com",
            "sender" : "bill.doe@gmail.com"
        },
        "-KbUr1_8AakzKjdwfmny" : {
            "data" : "Some message",
            "recipient" : "john.doe@gmail.com",
            "sender" : "bill.doe@gmail.com"
        },
    }
}

John Doe是您的收件人。

使用这种方法,每个用户都有自己的消息子节点,可以授予他阅读权限,其他用户将消息添加到所述用户。如果您想观察特定用户收到的消息,您只需观察节点

messages/userId-or-email-or-whatever-unique-identifier-you-use/