【问题标题】:How to structure firebase DB to block USER from displaying GROUPS如何构建firebase DB以阻止用户显示组
【发布时间】:2017-10-26 23:00:13
【问题描述】:

我在 firebase 中有 2 个 DB:USERSGROUPS,结构如下:

USERS
 USERID
   USERNAME
   USEREMAIL
   USERPHONE

GROUPS
 GROUPID
   GROUPNAME
   GROUPPIC
   TIMESTAMP

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

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

哪个最好,为什么?以及如何显示除被屏蔽组以外的所有组

USERS
  USERID
    USERNAME
    USEREMAIL
    USERPHONE
  BLOCKEDGROUPS
    GROUPID

 GROUPS
   GROUPID
     GROUPNAME
     GROUPPIC
     TIMESTAMP
   BLOCKEDUSERS
     USERID

非常感谢您的帮助。

更新:

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

【问题讨论】:

    标签: ios firebase firebase-realtime-database


    【解决方案1】:

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

    按照下面的说明进行

    1. 创建数据库 user_group_permission。
    2. 添加字段 user_id、group_id 和 status
    3. 默认状态为 1(视为未屏蔽)。
    4. 当您想要阻止时,将状态更改为 0(视为未阻止)。

    您必须在代码中使用枚举来处理此问题,以使值更有意义。

    这个模块的优点是,以后如果你添加其他功能而不是阻塞和取消阻塞,你只需要将状态值增加到 2、3、4 等等并更新枚举。

    【讨论】:

    • 谢谢。我不明白这部分“由于您已经在维护组 ID,请将其设置为启用/禁用标志”。你的意思是说在我的 GROUPS DB -->GROUPID 中,我需要启用/禁用标志?
    • 不,我的意思是在新表中您可以设置启用或禁用。当您开始访问时,首先检查组 ID 状态,然后根据状态加载基于组。
    • 好的,谢谢,阿斯拉姆。只要状态多于块,我肯定会实施您的方法。感谢您的帮助
    【解决方案2】:

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

    使用user 节点下的blockedGroups 列表的第一个选项可以轻松拒绝用户使用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 是来自 FirebaseAuth#getUid() 的用户的 UID,它将当前登录的用户与规则中的 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
          }
        }
      }
    }
    

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

    【讨论】:

    • 我已经更新了代码。我的所有用户的权限都被拒绝了。
    • @user3310076 抱歉,我刚刚注意到您想要过滤组列表!这不适用于我提出的安全规则,因此您需要在客户端过滤组。我已经更新了我的答案。
    • 非常感谢。在这种情况下,@Aslam 的方法也是正确的。由于我无法将您的两个解决方案都标记为答案,并且您已向我提供了更多详细信息,因此我会将您的解决方案标记为答案。再次感谢!
    • 没问题,很高兴您得到了解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多