Firebase将角色设置为用户

时间:2017-05-09 09:49:55

标签: firebase firebase-realtime-database firebase-security

我在Firebase中遇到了用户有角色的情况。根据已经在另一个“架构”中定义的一些配置文件,用户可以删除,更新,创建,删除和更新等等......许多组合都已经完成。

例:

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

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

由于

2 个答案:

答案 0 :(得分:3)

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

注意 ::我使用的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

所以这是一个有点denormalized的数据库结构,就像JSON数据库显然应该是这样。在这里阅读:https://firebase.googleblog.com/2013/04/denormalizing-your-data-is-normal.html每个分支都没有包含很多信息,除了它所涉及的内容。现在,如果你有一个统一的&#34;继承&#34;类型结构,然后您可以使用相对目录路径来检查用户尝试访问的目录,并在一个位置隔离验证规则 - 然后所有子节点将被覆盖,只要它们全部有基本权限的统一结构!

因此,只要您的新数据永远不会进入根目录下面的任何主要节点/目录(您可以编写规则以确保这一点),您可以使用data.parent ()到达你的条目的父级,然后再次调用parent()到达主目录(例如聊天室),然后检查每个连续号码的权限值,并匹配用户/组/世界列表:

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

这个(伪代码?)检查权限代码的第一个数字,然后检查节点&#34;用户&#34; subdir以查看当前用户是否具有该特定子节点的用户权限。在此之后添加条件OR以检查并查看是否存在group写入权限并且该组中存在用户。等等...所有来自根目录!只要确保你防止写下&#39; /&#39;或者&#39; //&#39; (首先使用&#39;&amp;&amp;&amp;&#39;编写这些条件,以便在尝试获取根的父级之前未通过检查等)并且它应该可以正常工作。

这不是一个绝对的结构,但是我将自己设定为“浅薄”。数据库,同时限制主要目录下的每个条目,如&#34; messages&#34;拥有权限代码并检查用户进行数据库读/写的UID,这给我带来了很多痛苦。虽然我上次使用它的时间大约是5个月前,但我不确定现在是否存在更简单或更简单的工具/库。希望这有帮助!

答案 1 :(得分:2)

我找到了一个解决方案......没有想法,如果是最好的...但是,解决我的问题。 在任何情况下,写条件都有点痛苦。

users roles"


然后在你的firebase规则中:

firebase rules

CUD 表示 C reate U pdate D elete。您也可以使用chmod数字(777,765等)。

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