如何设计好的架构&用于以两种模式管理用户数据的安全规则:admin&用户在Firebase中

时间:2015-09-23 10:47:06

标签: firebase

Lemme介绍我的问题,我想建立一个像咨询服务的产品,用户发送他们的问题(帖子),然后管理员给他一个建议。

所以这是我的架构: enter image description here

关于安全性,我更喜欢用户只能得到自己的问题,但管理员可以看到所有问题。

{
    "rules": {
        "profiles": {
            "$uid": {
                ".read": "auth != null && (auth.uid == $uid || root.child('profiles').child(auth.uid).child('role').val() == 'admin')",
                ".write": "auth != null && (auth.uid == $uid || root.child('profiles').child(auth.uid).child('role').val() == 'admin')"
            }
        },
        "posts": {
            "$uid": {
                ".read": "auth != null && (auth.uid == $uid || root.child('profiles').child(auth.uid).child('role').val() == 'admin' || root.child('profiles').child(auth.uid).child('role').val() == 'admin')",
                ".write": "auth != null && (auth.uid == $uid || root.child('profiles').child(auth.uid).child('role').val() == 'user')"
            },
            ".read": "auth != null && (root.child('profiles').child(auth.uid).child('role').val() == 'admin' || root.child('profiles').child(auth.uid).child('role').val() == 'mod')"   
        },
        ".read": false,
        ".write": false
    }
}

从用户视图来看,它看起来相当不错,因为我可以快速获得属于该用户的帖子。但是,从admin-view来看,它真的很糟糕:

  1. 我不知道如何纯粹获取所有用户的帖子。我必须得到所有用户,然后再获得用户的帖子。
  2. 使用$ watch无法获得完全触发事件。当用户添加新帖子时,我得到了“child_changed”事件(用户为id),而不是“child_added”(用id发布)
  3. 我想查询尚未收到管理员回复的所有问题,但不知道如何。
  4. 权衡,我已将所有帖子存储在普通数组中,例如:

    posts: {
        <post_id>: {
            uid: <user_id>,
            ....
        }
    }
    

    但后来我遇到了访问规则的问题,无法限制用户只访问自己的数据。如果没有读取规则,用户可以强制使用user-id来获取数据。

    请你给我一个提示。提前谢谢!

    P / S:我正在使用Firebase w / angular JS,没有后端服务器

0 个答案:

没有答案