我在Firebase中遇到了用户有角色的情况。根据已经在另一个“架构”中定义的一些配置文件,用户可以删除,更新,创建,删除和更新等等......许多组合都已经完成。
例:
Users/:
user_1:
create: "ok"
delete: "no"
update: "ok"
user_2:
create: "no"
... etc ...
如果“.write”权限不接受动态条件,如何在firebase中管理它?我发现Bolt有一些别名( create(), update(), 删除())然而,您只需创建 OR 更新或删除。一旦定义了一个,您就无法更改。
由于
答案 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)