火力地堡阅读基础上的关键数据规则
问题描述:
我有我的结构如下数据:火力地堡阅读基础上的关键数据规则
writings: {
'xxx-key-xxx': {
'user-id': 'xxxxx',
'title': 'title',
'content': 'content'
}
}
而且我想允许读取访问用户只有他的证件:
{
"rules": {
"writings": {
".read": "auth !== null && (root.child('writings').child('user-id').val() === auth.uid)",
}
}
}
但这不起作用。我怀疑我没有正确安装钥匙user-id
。任何想法?
答
您正在比较auth.uid
与路径/writings/user-id
的值,该路径缺少密钥xxx-key-xxx
,所以这将始终为假,因为此路径上的数据不存在。您可以更改您的规则以获得孩子的密码,但是,这会限制您的.read
许可权来阅读个人writings
儿童,例如
{
"writings": {
"$wid": {
".read": "auth !== null && root.child('writings/$wid/user-id').val() === auth.uid"
或等价
".read": "auth !== null && data.child('user-id').val() === auth.uid"
}
}
}
利用这些规则,你会看到Permission Denied
试图读取/writings
时 - 你必须逐个读取文件,所以你必须知道每个文档的关键。现在我们知道我们需要的是每个文档的关键字,我们需要找到一种检索它们的方法。
表示这样的关系的一种常见方式是通过扇出数据。我们有用户的uid
,我们需要他们拥有的文档的密钥。如果您要维护另一个存储每个用户文档的密钥的根节点,那么您可以引用该位置来检索用户的文档。
{
"user-writings": {
"$uid": {
".read": "auth.uid === $uid",
"$wid": {
".write": "auth.uid === $uid"
}
}
},
"users": {
...
},
"writings": {
"$wid": {
".read": "auth.uid === data.child('user-id').val()",
".write": "auth.uid === newData.child('user-id').val()"
}
}
}
这些规则确保用户只能凭借只具有user-writings/$uid
访问自己的文档的按键查看自己的文件。当用户创建书写时,他们还需要写入user-writings/$uid/$wid
将值设置为true
。
现在要检索属于用户的文档,您需要用用户的uid查询位置user-writings/$uid
以检索密钥,然后必须获取用户拥有的每个writings/$wid
的数据。它可能适合您将writings
完全丢弃并将每个用户的文档存储在数据库中相应的位置(user-writings/$uid
)。
什么不行?你能否显示你不想工作的代码?反之亦然:无法阅读的代码,您想要的代码? –
我在Firebase控制台中模拟并且被拒绝。我将存储有'uid'的数据设置为模拟器中使用的UID,但无法读取。 –
模拟的路径是'/ writings /'。我想获取用户拥有的所有文字。 –