1

我的数据库结构为:iOS是否在Firebase安全规则中写入拒绝错误或在规则模拟器中写入?

root 
    | 
    @-users 
    | | 
    | @-uid 
    |  | 
    |  @-registration 
    |  |  | 
    |  |  |-completed: true 
    |  | 
    |  @-sneakersPath//registered users post/write sneaker for sale to this path 
    |   | 
    |   | 
    |   @-autoID//i.e. xyz123 
    |    |-sneakercondition: "used" 
    |    |-sneakername: "nike" 
    | 
    | 
    @searchSnkPath//registered and anonymous users can search/read the sneakers for sale here 
     | 
     @-autoID//xyz123 
      |-sneakercondition: "used" 
      |-sneakername: "nike" 

我开发一个iOS应用程序只登录用户可以使用,我用火力地堡作为我的后端。我正在使用2种Firebase登录方法:电子邮件/密码和匿名。我有一个带有电子邮件/密码字段和按钮的登录场景,以匿名用户身份进入。

有2种情况:

  1. 用户创建使用Email/Password方法的帐户。他们必须填写电子邮件和密码字段。一旦他们这样做,这个用户得到一个永久的用户ID,并创建一个registration path。在该注册路径中,我添加一个键/值对completed:true。从这一点上,用户按下登录按钮进入应用程序(他们使用他们的永久uid登录)。该用户可以发帖(write)运动鞋出售给sneakersPath。他们还可以搜索(read)寻找他们或其他用户发布的运动鞋。

  2. 匿名用户使用该应用程序而不使用Anonymous方法创建帐户,该方法是匿名按钮。他们按匿名输入按钮,他们可以进入应用程序。一旦他们按下该按钮,他们就会得到一个临时uid,这对他们的访问是唯一的(他们使用临时uid登录)。由于此用户是匿名用户,因此此用户唯一可以做的事情就是搜索(read)来自1st场景的其他用户发布了哪些内容供销售。一旦他们注销,如果他们匿名登录,他们会得到一个不同的临时用户。

在我上运行client side检查或验证用户是否在作为注册用户登录,如果他们是匿名用户二者的情况。基于这些检查,我可以防止匿名用户匿名发布运动鞋。一切工作正常。

即使我在iOS端运行检查,我想在我的火力地堡规则一些额外的执法,以确保匿名用户不能发布任何东西,我想在其上运行KVP completed:true检查明确:

root.child('users').child($uid).child('registration').child('completed').val() === true" 

现在我的安全规则是:

{ 
    "rules": { 
    "users": { 
     "$uid": { 
      ".read": "$uid === auth.uid && auth != null" 
      ".write": "$uid === auth.uid && auth != null && root.child('users').child($uid).child('registration').child('completed').val() === true" 
    } 
    } 
} 
} 

当我去火力地堡规则模拟器,并尝试写我得到:

enter image description here

enter image description here

在下面的图片我有身份验证切换到右为“on”和我唯一的选择是匿名,谷歌,Facebook,Twitter和自定义。由于我使用的是电子邮件/密码,并没有列出,我选择了自定义。我也没有检查管理员框,因为我不知道它是什么。

enter image description here

我在做我的Json安全规则错,还是我使用规则正确模拟器?

回答

0

的问题是,在火力地堡的数据库里面,我不得不补充说,火力地堡给了我里面的完全相同FOO UID数据模拟器。

root 
    | 
    @-users 
    | | 
    | @-uid//this is another user's uid 
    | | | 
    | | @-registration 
    | | |  | 
    | | |  |-completed: true 
    | | | 
    | | @-sneakersPath 
    | |  | 
    | |  | 
    | |  @-autoID 
    | |   |-sneakercondition: "used" 
    | |   |-sneakername: "nike" 
    | | 
    | | 
    | @59c96197-7cf9-44d3-bfbc-8d4f3324461//this is the foo uid the simulator provided. It must be added in the db so it can read it 
    | | | 
    | | @-registration 
    | | |  | 
    | | |  |-completed: true 
    | | | 
    | | @-sneakersPath 
    | |  | 
    | |  | 
    | |  @-autoID//abc789 
    | |   |-sneakercondition: "new" 
    | |   |-sneakername: "reebok" 
    | 
    @searchSnkPath 
     | 
     @-autoID//xyz123 
     | |-sneakercondition: "used" 
     | |-sneakername: "nike" 
     | 
     | 
     | 
     @-autoID//abc789 
      |-sneakercondition: "new" 
      |-sneakername: "reebok" 

这里是FOO路径/ UID数据,该模拟器提供:

enter image description here

注foo的UID也令牌有效载荷内:

enter image description here

如果您要使用数据库内的真实数据在模拟器中测试,请确保你删除模拟器提供的foo路径/ uid,并将其替换为数据库中的任何路径/ uid,否则你将继续得到一个Simulated Write Denied响应。

里面的令牌有效载荷可以保持"provider" : "anonymous"与实际数据使用从数据库中,但可以肯定的哪一个使用

0

你必须确保你的UID和“注册/已完成的价值观是正确的。所以你想指定一个具有'registration/completed'设置为'true'的实际用户的UID。请确保您使用的是正确的类型(布尔值)。可能希望将支票更改为'=='而不是'==='。

你可能要改变这种

root.child('users').child($uid).child('registration').child('completed').val() === true 

这个

root.child('users').child($uid).child('registration/completed').val() == true 
+0

感谢您的帮助你,以取代foo的UID。在安全规则===是好的。我已经用“.read”测试了它:“$ uid === auth.uid && auth!= null”,它的工作原理不是这样。您可以观看这个短片:https://www.youtube.com/watch?v=qLrDWBKTUZo。我也尝试使用您建议的实际用户标识,并且仍然拒绝写入。无论如何感谢 –

+0

我猜你没有理解我。这两个操作符有区别,如果你的值是'“true”而不是'true',那**会成为一个问题。我想要注意的是模拟器访问真实的数据库。 – creativecreatorormaybenot

+0

这不是原因。观看我建议的视频:youtube.com/watch?v=qLrDWBKTUZo并直接进入分钟2:56。我还看到了其他使用===检查布尔值的示例 –