Firebase 为用户设置角色

Firebase set roles to users

我在 Firebase 中遇到用户具有角色的情况。根据已经在另一个 "schema" 中定义的一些配置文件,用户可以删除、更新、创建、删除和更新等等......进行了许多组合。

例如:

Users/:
    user_1:
        create: "ok"
        delete: "no"
        update: "ok"
    user_2:
        create: "no"
        ... etc ...

一旦“.write”权限不接受动态条件,如何在 firebase 中管理这个?我发现 Bolt 有一些别名(create()update (), delete()) 但是,您只需要创建 OR 更新 OR 删除。一旦定义就不能更改。

谢谢

我找到了解决方案...不知道是否是最好的...但是,请解决我的问题。 不管怎样,写条件还是有点蛋疼。


然后在您的 firebase 规则中:

CUD 表示 Create Update D元素。您也可以使用 chmod 数字(777、765 等)。

现在,我需要了解如何编写 -ud、--d 等的条件。 :)

好的,我假设您的数据结构如下所示。这个答案是我自己对如何动态管理访问数据库不同部分的用户的主观方法。

注意::我使用的 chmod 代表 READ-WRITE-DELETE,而不是 READ-WRITE-EXECUTE(即 6=读+写但不删除,7 =完整的 CRUD 权限)。此示例数据库分为 3 个部分,并为社交媒体应用程序建模。此外,"world" 的默认值(第 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

所以这是一个有点 denormalized 的数据库结构,就像 JSON 数据库显然应该是的那样。在这里阅读:https://firebase.googleblog.com/2013/04/denormalizing-your-data-is-normal.html 除了它所关注的内容之外,每个分支都没有太多信息。现在,如果你有一个统一的 "inheritance" 类型结构,那么你可以使用相对目录路径来检查相对于用户试图访问的目录,并将验证规则隔离在一个地方——在你的根目录——然后所有的子节点只要基本权限结构统一就覆盖!

因此,只要您的新数据永远不会进入根目录 它下面的任何主要 nodes/directories 目录(您也可以编写规则来确保这一点),您使用 data.parent() 获取条目的父级,然后再次调用 parent() 以获取主目录(例如聊天室),然后检查每个连续数字的权限值,并匹配针对 users/group/world 的列表:

".write": "data.parent().parent().child('permissions').val().beginsWith('6') && data.parent().child('users').child($uid).exists" 

此(伪代码?)检查权限代码的第一位数字,然后检查节点的 "users" 子目录以查看当前用户是否具有该特定子节点的用户权限。在此之后添加一个条件 OR 来检查并查看是否有 group 写入权限以及该用户是否存在于该组中。依此类推...全部来自根目录!只要确保你防止在 '/' 或 '//' 下写(首先使用 '&&' 写这些条件,这样它在尝试获取根的父级之前检查失败,等等)并且它应该运行良好。

这不是一个绝对结构,但我将我的设置为 'shallow' 数据库,同时限制主目录下的每个条目,如 "messages" 具有权限代码并检查它创建数据库的用户的 UID read/write,这让我免去了很多麻烦。虽然我最后一次使用它是大约 5 个月前,但我不确定现在是否存在事情变得更简单或简单 tools/libraries。希望这对您有所帮助!