如何为共同成员编写安全规则

时间:2014-08-19 02:49:21

标签: firebase firebase-security

我正在尝试创建一个安全规则,允许组中的任何用户读取同一组中任何其他用户的信息。换句话说,用户应该能够读取属于公共组的任何用户的用户信息。

这就是我所拥有的:

{
  "rules": {
    "users": {
      "$user_id": {
        // Any user beloging to at least one group in common should be able to read
        ".read": "$user_id === auth.uid || root.child('users/' + $user_id + '/groups').hasAny(root.child('users/' + auth.uid + '/groups'))",
        ".write": "$user_id === auth.uid",

        "groups": {
          "$group_id": {
            ".validate": "root.child('groups/' + $group_id).exists() && newData.isBoolean()"
          }
        }  
      }
    },

    "groups": {
      "$group_id": {
        "name": { ".validate": "newData.isString() && newData.val().length > 0 && newData.val().length < 50" }
      }
    },

    "members": {
      "$group_id": {
        ".read": "root.child('members/' + $group_id + '/' + auth.uid).exists()",
        ".validate": "root.child('groups/' + $group_id).exists()",
        "$user_id": {
          ".write": true, // Skipped for brevity
          ".validate": "root.child('users/' + $user_id).exists() && newData.isBoolean()"
        }
      }
    },
    }
  }
}

当然,hasAny函数不是API的一部分。有没有办法用现有的API做到这一点?有没有计划添加这样的东西?

2 个答案:

答案 0 :(得分:0)

维护用户的好友列表。

您必须继续引用用户的好友列表。当用户加入群组时,请将群组成员的auth.uid添加到用户的friends列表中。然后,只有他的朋友可以阅读他的个人资料。

{"rules":{
  // $user_id == current user's auth.uid
  // $friend_id == his friend's auth.uid
  // $member_id == group member's auth.uid
  "users":{"$user_id":{
    "friends":{"$friend_id":{
    }},

    // readable by my friends:
    ".read":"auth =! null && data.child('friends').hasChild(auth.uid)"

  }},
  "groups":{"$group_id":{
    "members":{"$member_id":{
    }}
  }}
}}

答案 1 :(得分:0)

维护多个配置文件。

以下答案为用户加入的每个组创建多个配置文件副本/视图。就像多个简历一样,您将自己的自我发送给不同的公司。因此,根据您发送给他们的简历,公司成员可能会对您有所了解。

每个用户的个人资料只能查看指定群组的成员。

  

当观看者auth.uidbarney群组的成员时,观看者可以查看在其帐户中写有profile/barney的所有用户。

{"rules":{
  // $user_id == current user's auth.uid
  // $friend_id == his friend's auth.uid
  // $member_id == group member's auth.uid
  "users":{"$user_id":{
    "profile":{"$group_id":{
        // readable by group members:
        ".read":"auth =! null && root.child('groups').child($group_id).child('members').hasChild(auth.uid)"
    }}
  }},
  "groups":{"$group_id":{
    "members":{"$member_id":{
    }}
  }}
}}