2017-05-11 90 views
2

我有一个问题,为了我自己的理智。下面是我的火力规则多重Inhertitance Firebase安全规则

{ 
    "rules": { 
     ".read": "auth != null", 
     ".write" : false, 
     "users": { 
      "$uid": { 
       ".read": "auth != null && auth.uid == $uid", 
       ".write": "auth != null && auth.uid == $uid", 
       "tokens": { 
        ".write": "(newData.val() < data.val())" 
       } 
      } 
     }, 
     ... 

一部分如果我理解正确的规则规定:

  • 所有用户都必须以读取任何节点
  • 所有的用户不能被auth'ed写入任何节点
  • 用户特定的节点:
  • 为了从您自己的数据读取,你需要auth'ed,你只能读取自己的节点
  • 为了写自己的用户数据,您必须auth'ed,你只能写自己的节点
  • 用户/令牌节点只能递减,并且永远不会增加任何用户

有人可以确认我的假设/理解,阅读Firebase安全规则文档。

也没有人有任何好的文章或有用的提示使用模拟器!?

回答

0

安全规则的一个重要概念是读/写规则在树中“级联”。这在the documentation中简要讨论。这意味着,当您从上到下阅读规则时,授予访问权限的第一条规则优先于位于该位置子项下的任何规则。

解决您的每个项目:

  • 所有用户都必须以读取任何节点(
  • 的所有用户无法写入任何节点(非权威性被auth'ed “编用户无法写入任何节点
  • 用户特定的节点:
  • 为了从您自己的数据读取,你需要auth'ed,你只能读取自己的节点(YES
  • 为了写自己的用户数据,您必须auth'ed,你只能写自己的节点(
  • 用户/令牌节点只能递减和从来没有增加任何用户(见下文

在当前的规则,对于较小的令牌检查是不是有效,因为授予的auth'ed用户写访问的优先规则覆盖它。您还需要解决没有现有令牌值的情况。我的修复建议是使用.validate规则。该documentation建议:

使用一次.WRITE规则授予访问权限,以确保数据 被写入符合一个特定的模式。

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": false, 
    "users": { 
     "$uid": { 
     ".read": "auth.uid == $uid", 
     ".write": "auth.uid == $uid", 
     "tokens": { 
      ".validate": "!data.exists() || (newData.val() < data.val())" 
     } 
     } 
    } 
    } 
} 

至于模拟器,我不知道任何用户指南的,但设法了解如何通过实验来使用它。这是理解规则的非常有效的工具。

下面是使用模拟器的一些情况:

当您打开模拟器,身份验证是关闭的,它模拟一个未验证用户。要模拟阅读,请点击阅读按钮,输入一个位置:例如/users/xyz/tokens,然后点击运行。您会看到禁止该操作的规则上的红色X.为了模拟已认证的读取,请单击已认证的按钮,并为了方便起见,输入一个简单的用户UID,如“Frank”。现在输入地址/users/Frank/tokens,点击运行并观察读取成功。

您可以为写入,输入位置,授权设置和值进行类似的测试。

+0

我不确定你是否正确,在模拟器中我能够成功写入,即使我在根目录下有“写入”:“false”。在模拟器中试一试。但是你是正确的,它不会以其他方式工作。<<如果父层次结构中的任何安全规则授予访问权限,那么它是允许的。所以你不能在父级将安全设置为TRUE,然后在子路径中撤销>> – Learn2Code

+0

,但我的主要原因是要找出如何执行令牌规则,只允许用户减少值并且永不增加它!?你有什么想法!? – Learn2Code

+0

@ Learn2Code:我正在使用您的规则,无法写入。你指定哪个位置? –