【发布时间】:2018-07-12 07:39:19
【问题描述】:
我正在为匿名用户设置一个显示名称,并希望确保新值与此设置的显示名称相匹配。以下规则失败:
"name": { ".validate": "newData.val() == auth.token.name" }
这是为什么? docs 表示显示名称存储在auth.token.name 中。
以下是我的 Firebase 规则的完整副本:
{
"rules": {
".read": false,
".write": false,
"messages": {
".read": true,
"$message": {
".write": "auth != null",
".validate": "newData.hasChildren(['createdAt', 'text', 'user'])",
"createdAt": { ".validate": "newData.val() == now" },
"text": { ".validate": "newData.isString() && newData.val().length > 0" },
"user": {
".validate": "newData.hasChildren(['_id', 'name'])",
"_id": { ".validate": "newData.val() == auth.uid" },
"name": { ".validate": "newData.val() == auth.token.name" },
"$other": { ".validate": false }
},
"$other": { ".validate": false }
}
}
}
}
【问题讨论】:
-
请发布您的完整安全规则 JSON
-
@RosárioPereiraFernandes 刚刚发布了它们。当我将 user.name 规则切换为仅验证 newData.isString() 时,我确认写入工作
-
您确定可以按照当前规则进行读写吗?因为根据the documentation:“较浅的安全规则覆盖较深路径的规则。子规则只能授予父节点已经声明的额外权限。它们不能撤销读取或写入权限。”。而且我看到您拒绝在根节点中进行读写。所以任何读或写都应该返回一个权限被拒绝的错误。º
-
它工作,因为模拟器读/写通过,我可以从我的应用程序中获取数据。我相信这意味着子规则不能撤销访问权限,但他们可以授予访问权限。我在模拟器中使用这个测试payload:
{ "createdAt": { ".sv": "timestamp" }, "text": "Test 1", "user": { "_id": "48c83bf9-7354-4720-838f-8b68e0addd51", "name": "Mike", } }
标签: firebase firebase-realtime-database firebase-authentication firebase-security