【问题标题】:Firebase set roles to usersFirebase 为用户设置角色
【发布时间】:2017-10-07 13:43:33
【问题描述】:

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

例如:

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

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

谢谢

【问题讨论】:

  • 也许尝试为每个用户创建一个 linux chmod 样式的字段并以这种方式创建权限?这样您就只有一个字段,并且在您的权限中定义所有组合一次。
  • 确切地说,Bolt 是一个实验性的安全和规则编译器,处于测试阶段。
  • 嗨@PrestonGarno。是的,这行得通。恢复角色是可能的,但符合代表角色的条件是我不知道该怎么做的部分。您可以恢复 777 或 765 等角色,但您不能根据此更改 firebase 中 .write 的规则。
  • 我从未使用过 Bolt,但我记得在标准 Firebase 规则中,您可以根据节点上的字段值设置权限,不是吗?还有我记得实现的自定义用户令牌。我确实记得它很有挑战性!您是否检查过更新的 (Google) API 文档? firebase.google.com/docs/database/security/user-security
  • 我的意思是,在 firebase 规则文件的 .write/.read 规则中,您将写出 chmod 规则的所有不同组合。然后只需有一个名为“访问”的字段,或者为每个用户提供一个数字,代表他们在数据库的特定“分支”上的访问级别。然后,当您想要更改其访问权限时,只需更改每个用户的编号。

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


【解决方案1】:

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


然后在您的 Firebase 规则中:

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

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

【讨论】:

  • 这可以工作,但也可能会变得混乱。看看我的解决方案,让我知道你的想法。我更喜欢采用每个“主”节点权限结构的路线,因为它看起来更灵活。请记住 - 不要害怕有一堆条目 - 似乎违反直觉,但数据库设置为分散在各处,但易于维护/组织
【解决方案2】:

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

注意::我使用的 chmod 代表 READ-WRITE-DELETE,而不是 READ-WRITE-EXECUTE(即 6=读+写但不删除,7=完全 CRUD 权限) .此示例数据库由 3 个部分构成,并为社交媒体应用程序建模。此外,“世界”的默认值(第 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 每个分支都没有太多信息,除了它所关心的内容。现在,如果您有一个统一的“继承”类型结构,那么您可以使用相对目录路径来检查相对于用户尝试访问的目录,并在一个位置(在您的根目录)隔离验证规则,然后所有只要子节点都具有基本权限的统一结构,就会被覆盖!

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

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

这(伪代码?)检查权限代码的第一个数字,然后检查节点的“用户”子目录以查看当前用户是否具有该特定子节点的用户权限。在此之后添加条件 OR 以检查并查看是否有 group 写入权限以及用户是否存在于组中。等等......全部来自根目录!只需确保您不要在 '/' 或 '//' 下写入(首先使用 '&&' 编写这些条件,因此在尝试获取根的父级之前检查失败等),它应该可以正常工作。

这不是一个绝对的结构,但我将我的数据库设置为“浅”数据库,同时将“消息”等主目录下的每个条目限制为具有权限代码并检查用户的 UID DB读/写,它为我节省了很多痛苦。虽然我最后一次使用它是在大约 5 个月前,但我不确定现在是否存在变得更简单或简单的工具/库。希望这会有所帮助!

【讨论】:

  • 非常感谢您的回答!!!我会仔细看看。无论如何,我只是推出了一个(直到现在)对我有用的解决方案。
  • @Mario 没问题,希望你能搞清楚。如果这对您有用,请不要忘记将其标记为正确:)祝您好运。
  • @Mario 有一件事我忘了说清楚:permissions 节点位于“/messages/permissions”(直接在主节点下)定义每个消息对话的规则。然后usergroup 节点以每个聊天 为基础存在,所以它是 /messages//users 和 /messages//group,因此每条消息聊天 1 个。我认为我的根本规则不正确,这就是我要澄清的原因
  • 好的!再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 2011-06-25
相关资源
最近更新 更多