如何构建firebase DB以阻止USER显示GROUPS

时间:2017-10-26 11:17:43

标签: ios firebase firebase-realtime-database

我在firebase中有2个数据库:USERSGROUPS结构如下:

USERS
 USERID
   USERNAME
   USEREMAIL
   USERPHONE

GROUPS
 GROUPID
   GROUPNAME
   GROUPPIC
   TIMESTAMP

我以user123身份登录。在GroupsViewController中,将显示所有组,并且我可以选择阻止/取消阻止某些组。一旦被阻止,该特定组就不应显示在我的GroupsViewController

现在,我想重新构建数据库,以便不会为该特定用户(user123)显示被阻止的组。我不确定BLOCKEDUSERS 下的子节点GROUPS是否在BLOCKEDGROUPS下有子节点USERS,如下所示

哪一个最好,为什么?以及如何显示除被阻止的组之外的所有组

USERS
  USERID
    USERNAME
    USEREMAIL
    USERPHONE
  BLOCKEDGROUPS
    GROUPID

 GROUPS
   GROUPID
     GROUPNAME
     GROUPPIC
     TIMESTAMP
   BLOCKEDUSERS
     USERID

我非常感谢你的帮助。

更新:

我在userInfo下添加了blockedGroups,将一些groupID添加到特定的user.uid并创建了规则,如下所示。理想情况下" groupID2"应该为用户阻止组#6; 6viyeuDpC5TPbO3coElZp3LWWdH3",但是拒绝所有用户的权限。我做错了什么?

enter image description here

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以添加另一个跟踪基于用户权限的数据库。它应该保留所有用户特定的权限,因为您已经在维护组ID,所以将其设置为启用/禁用标志。

按照以下说明

  1. 创建DB user_group_permission。
  2. 添加字段user_id,group_id和status
  3. 默认设置状态为1(视为未阻止)。
  4. 如果要阻止将状态更改为0(视为未阻止)。
  5. 您必须在代码中使用枚举来处理此问题,以使该值更有意义。

    此模块的优点在于,如果您添加除阻止和解除阻止之外的其他功能,您只需将状态值增加到2,3,4,依此类推并更新枚举。

答案 1 :(得分:0)

如果您想要启动fanning out your data,可以同时使用两种结构选项。

使用blockedGroups节点下的user列表的第一个选项,可以轻松拒绝使用Firebase security rules访问用户已阻止的群组:

{
  "rules": {
    "groups": {
      "$groupId": {
        ".read": "root.child('users').child(auth.uid)
          .child('blockedGroups').child($groupId)
          .exists() != true"
      }
    }
  }
}

因此,您的数据库结构将类似于:

users
 |- userId1
   |- userName: "User 1"
   |- ...
   |- blockedGroups
     |- groupId1: true
groups
 |- groupId1
   |- groupName: "Group 1"
   |- ...
 |- groupId2
   |- name: "Group 2"
   |- ...

每个用户ID是来自UID的用户FirebaseAuth#getUid(),用户将当前登录的用户与规则中的auth.uid进行匹配。 blockedGroups列表是组ID的索引列表,如flatten data structures documentation示例中所示。

不幸的是,上面的安全规则方法不能用作过滤groups列表的方法,而只能作为拒绝访问特定组节点的方法。这是因为rules are applied atomically top-down

相反,您需要为用户检索blockedGroups列表,并检索所有组,然后执行客户端过滤器以忽略或丢弃用户不想要的组看到。在Swift中有类似的东西:

var blockedGroups = [String]()
blockedGroupsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    blockedGroups.append(child.key)
  }
  updateView()
}

func updateView() {
  groupsRef.observe(.value) { snapshot in
    for child in snapshot.children {
      if blockedGroups.contains(child.key) == false {
        // Add to view
      }
    }
  }
}

或者,根据您的应用程序的要求,如果您不想执行客户端过滤,您可以将组管理翻转为选择加入而不是选择退出,并使用{{列表1}}然后循环遍历此列表,以按键分别从数据库中检索每个组。