【发布时间】:2016-08-19 20:05:42
【问题描述】:
我正在尝试创建一个使用 Firebase 数据库来存储用户信息的网站。我想使用唯一的用户名。我有两个索引,一个用于用户,另一个用于用户名。
我的数据库结构如下:
users {
$uid {
username: "username1",
gender: "xyz"
email: "xyz"
}
},
usernames {
"username1": $uid"
}
用户使用他们的 $uid 声明用户名。
这些是我的规则:
{
"rules": {
"users": {
"$uid": {
".write": "auth !== null && auth.uid === $uid",
".read": "auth !== null && auth.uid === $uid",
"username": {
".validate": "
!root.child('usernames').child(newData.val()).exists() ||
root.child('usernames').child(newData.val()).val() == $uid"
}
}
},
"usernames" : {
".write": "!data.exists() && auth!= null",
".validate": "newData.val() == auth.uid" <---- I can't get this too work
}
}
}
在 $uid 下设置用户名时,它会检查用户名索引,因此用户名只能使用未使用的用户名或具有自己的 $uid 的用户名写入。
我只想要值是经过身份验证的用户 uid 并且键是用户名的数据。我不能让这个工作。我怀疑我使用 newData().val() 不正确。我的验证语句失败。
我想避免使用自定义令牌,但我愿意接受任何建议。提前致谢。
对不起,如果这个解释过于冗长,这是我在 StackOverflow 上的第二篇文章。
编辑 #2 我做了一些研究,据我所知,我在文档中找到的所有内容都谈到了在 .val() 之前使用 .child() 的必要性,但我需要 .child 来获取变量而不是设置的用户名。
【问题讨论】:
-
你说你不能让它工作,但你没有说它怎么不工作。无论值如何,它都会失败还是通过验证?
-
我支持carant:乍一看,规则看起来不错。什么失败了?对于这样的事情,它有助于查看当前的 JSON(作为文本,没有屏幕截图)和失败的写入操作。
-
很抱歉不够清晰。我目前无法验证用户名。
标签: firebase firebase-realtime-database firebase-security