我的数据库结构为: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种情况:
用户创建使用
Email/Password
方法的帐户。他们必须填写电子邮件和密码字段。一旦他们这样做,这个用户得到一个永久的用户ID,并创建一个registration path
。在该注册路径中,我添加一个键/值对completed:true
。从这一点上,用户按下登录按钮进入应用程序(他们使用他们的永久uid登录)。该用户可以发帖(write)
运动鞋出售给sneakersPath
。他们还可以搜索(read)
寻找他们或其他用户发布的运动鞋。匿名用户使用该应用程序而不使用
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"
}
}
}
}
当我去火力地堡规则模拟器,并尝试写我得到:
在下面的图片我有身份验证切换到右为“on”和我唯一的选择是匿名,谷歌,Facebook,Twitter和自定义。由于我使用的是电子邮件/密码,并没有列出,我选择了自定义。我也没有检查管理员框,因为我不知道它是什么。
我在做我的Json安全规则错,还是我使用规则正确模拟器?
感谢您的帮助你,以取代foo的UID。在安全规则===是好的。我已经用“.read”测试了它:“$ uid === auth.uid && auth!= null”,它的工作原理不是这样。您可以观看这个短片:https://www.youtube.com/watch?v=qLrDWBKTUZo。我也尝试使用您建议的实际用户标识,并且仍然拒绝写入。无论如何感谢 –
我猜你没有理解我。这两个操作符有区别,如果你的值是'“true”而不是'true',那**会成为一个问题。我想要注意的是模拟器访问真实的数据库。 – creativecreatorormaybenot
这不是原因。观看我建议的视频:youtube.com/watch?v=qLrDWBKTUZo并直接进入分钟2:56。我还看到了其他使用===检查布尔值的示例 –