我在firebase中有2个数据库:USERS
和GROUPS
结构如下:
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",但是拒绝所有用户的权限。我做错了什么?
答案 0 :(得分:1)
您可以添加另一个跟踪基于用户权限的数据库。它应该保留所有用户特定的权限,因为您已经在维护组ID,所以将其设置为启用/禁用标志。
按照以下说明
您必须在代码中使用枚举来处理此问题,以使该值更有意义。
此模块的优点在于,如果您添加除阻止和解除阻止之外的其他功能,您只需将状态值增加到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}}然后循环遍历此列表,以按键分别从数据库中检索每个组。