检查唯一用户名时 Firebase 权限被拒绝
Posted
技术标签:
【中文标题】检查唯一用户名时 Firebase 权限被拒绝【英文标题】:Firebase permission denied when checking unique username 【发布时间】:2017-02-12 13:59:07 【问题描述】:我想检查用户名是否已被使用。当当前用户没有“用户名”的孩子时调用此函数:
func createUsername()
let userID = FIRAuth.auth()?.currentUser?.uid
FIRDatabase.database().reference().updateChildValues([
"users/\(userID!)/username": username.text!,
"usernames/\(username.text!)": userID!
], withCompletionBlock: (error, reference) in
if (error != nil)
print("disallowed")
// Write was disallowed because username exists
)
结合本规则:
"rules":
"users":
"$uid":
".read": "$uid === auth.uid",
".write": "$uid === auth.uid",
"username":
".read": true,
".write": "!data.exists() && newData.exists()",
".validate": "newData.isString()"
,
"usernames":
"$username":
".read": true,
".write": "!data.exists() && newData.exists()",
".validate": "newData.isString() && newData.val() == root.child('users/' + auth.uid + '/username').val()"
我得到了答案:https://groups.google.com/forum/#!topic/firebase-talk/dA1Lkykd-tk 我收到此错误消息:
[Firebase/Database][I-RDB03812] updateChildValues: at / failed: permission_denied
我不确定为什么这不起作用。我也试过这个答案:Firebase android : make username unique 但这对我不起作用。规则有问题,但我不知道是什么。
更新,规则变化不大,还是一样的错误:
"rules":
"users":
"$uid":
".read": "$uid === auth.uid",
".write": "$uid === auth.uid",
"username":
".read": true,
".write": "!data.exists() && newData.exists()",
".validate": "newData.isString()"
,
"usernames":
"$username":
".read": true,
".write": "!data.exists() && newData.exists()",
".validate": "newData.isString() && newData.val() == newData.parent().parent().child('users/' + auth.uid + '/username').val()"
我也改变了 parent() 的东西,但它也不起作用。我变成了4个父母,0个父母。同样的错误。
【问题讨论】:
【参考方案1】:更新:问题出在这条验证规则上:
".validate": "newData.isString() && newData.val() == root.child('users/' + auth.uid + '/username').val()"
您正在将新数据与 当前 根进行比较。由于用户刚刚创建,/users/$uid
尚不存在。
您要做的是将新数据与 new 用户节点进行比较。要到达此节点,您应该在比较时从 newData
导航到 new 根:
".validate": "newData.isString() &&
newData.val() == newData.parent().parent().child('users/' + auth.uid + '/username').val()"
我将在下面留下我之前的回复,因为它可能有助于学习如何解决此类问题。
我刚刚将您的规则粘贴到我的一个项目中,稍微简化了它们并毫无问题地使用了您的代码。我不确定你为什么会遇到问题。
代码:
FIRAuth.auth()?.signInAnonymously(completion: (user, error) in
let username = "puf"
let userID = FIRAuth.auth()?.currentUser?.uid
self.ref.child("42188459").updateChildValues([
"users/\(userID!)/username": username,
"usernames/\(username)": userID!
], withCompletionBlock: (error, reference) in
if (error != nil)
print("disallowed")
// Write was disallowed because username exists
)
)
规则sn-p:
"users":
"$uid":
".write": "$uid === auth.uid",
"username":
".write": "!data.exists() && newData.exists()",
,
"usernames":
"$username":
".write": "!data.exists() && newData.exists()",
生成的 JSON:
"usernames" :
"puf" : "DBP4Pw3uiwQfUaDJw1XBR8oFBUK2"
,
"users" :
"DBP4Pw3uiwQfUaDJw1XBR8oFBUK2" :
"username" : "puf"
【讨论】:
我复制了您的更新规则并将其替换为旧值。但是,我仍然收到错误消息。此错误发生在 .validate 行,即我刚刚复制的规则。在 Firebase 的模拟器中,我也收到错误消息。我有这些设置:写入,位置:/usernames/dfggdfg/,json 值:“key”:“value”,验证:YES,然后执行。阅读有效,但写作仍有一些问题。其余规则与上述完全相同。我将更新我正在使用的当前规则。 XCode 仍然给出同样的错误。以上是关于检查唯一用户名时 Firebase 权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
批量用户订阅 Firebase 中的主题时出现权限被拒绝错误
React/Rebase/Firebase 警告:权限被拒绝 - 如何添加用户身份验证?