我在 Firebase 中遇到了一种情况,用户拥有角色。根据另一个“模式”中已经定义的一些配置文件,用户可以删除、更新、创建、删除和更新等等......可以进行许多组合。
例如:
Users/:
user_1:
create: "ok"
delete: "no"
update: "ok"
user_2:
create: "no"
... etc ...
一旦“.write”权限不接受动态条件,如何在 firebase 中管理此操作?我发现 Bolt 有一些别名(create()、update()、 delete()) 但是,您只需创建或更新或删除。一旦定义,您就无法更改。
谢谢
最佳答案
好的,所以我假设您的数据结构如下。这个答案是我自己关于如何动态管理访问数据库不同部分的用户的主观方法。
注意::我使用的 chmod 代表 READ-WRITE-DELETE,而不是 READ-WRITE-EXECUTE(即 6=读+写但不删除,7=完全 CRUD 权限) 。该示例数据库由 3 部分组成,并对社交媒体应用程序进行建模。此外,“世界”的默认值(第三位数字很可能只是经过身份验证的用户。这是一个非常简单的示例:
root/
|
|-- user/ <-main node that contains profile info
| \uid <-node name - one for each user with sub-nodes containing profile info
| \user
| |-<UID> <-shows who has "user" privileges (1st digit)
| \group
| |-<UID> <-shows who has "group" privileges (1st digit)
| \permissions = 744 <-universal "user" entry rule
|
|-- trending/ <-node that contains global, read only info
| \user <-No one will be here for "trending"
| \group
| \feed-data
| \<POST_UUIDS> <-Data here
| \permissions = 444 <-Everyone can read the global feed
|
|-- messaging/
| \<chat-uuid-number-1>
| \user
| |-<User1>
| |-<User2>
| \group
| \messages node
| \<chat-uuid-number-2>
| \user
| |-<User8>
| |-<User5>
| \messages-node
|
| \permissions = 600 <-Only 2 users can read&send messages in their node
|
|-- chatrooms/ <-each node contains a list of UID, and list of messages
| \<room-uuid-number>
| \user
| |-<Admin1>
| |-<Admin2...>
| \group
| |-<uid1>
| |-<uid2>
| |-<uid3...infinity>
| \permissions = 760 <-Only admins have user privilege, users in chat can send and receive in the chat though
所以这是一个有点非规范化
的数据库结构,就像 JSON 数据库显然应该是的那样。在这里阅读:https://firebase.googleblog.com/2013/04/denormalizing-your-data-is-normal.html每个分支除了它所关心的信息外并不保存太多信息。现在,如果您有一个统一的“继承”类型结构,那么您可以使用相对目录路径来检查相对于用户尝试访问的目录,并将验证规则隔离在一个位置(在您的根目录),然后将所有只要子节点具有统一的基本权限结构,就会被覆盖!
因此,只要您的新数据永远不会进入根目录或其下面的任何主要节点/目录(您也可以编写规则来确保这一点),您就可以使用 data.parent () 访问条目的父目录,然后再次调用parent() 访问主目录(例如聊天室),然后检查每个连续数字的权限值,并与用户/组/世界列表进行匹配:
".write": "data.parent().parent().child('permissions').val().beginsWith('6') && data.parent().child('users').child($uid).exists"
这个(伪代码?)检查权限代码的第一个数字,然后检查节点的“users”子目录以查看当前用户是否具有该特定子节点的用户权限。在此之后添加条件 OR 来检查组中是否存在组
写入权限以及用户是否存在。等等...全部来自根目录!只要确保避免在“/”或“//”下书写(首先使用“&&”编写这些条件,这样在尝试获取根的父级等之前检查就会失败),并且它应该可以正常工作。
这不是一个绝对的结构,但我将我的数据库设置为“浅”数据库,同时限制主目录(如“messages”)下的每个条目具有权限代码并检查用户的 UID数据库读/写,它为我节省了很多痛苦。虽然我上次使用它是大约 5 个月前,但我不确定事情是否变得更简单,或者现在是否存在简单的工具/库。希望这有帮助!
关于Firebase 为用户设置角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43866550/