我正在尝试创建一个规则,以便根据已验证的用户创建/访问FRD数据。但是在运行**Rules Playground
**时遇到错误
我想要的是,用户正在创建类别。所以用户只能读取他们的类别和更新这些类别。
规则:
{
"rules": {
"users": {
"$uid": {
".write": "auth != null && $uid === auth.uid",
".read": "auth != null && $uid === auth.uid"
}
},
"categories": {
"$uid": {
".write": "auth != null && $uid === auth.uid",
".read": "auth != null && $uid === auth.uid"
}
}
}
}
验证用户:
实时数据库
类别
用户
类别Flutter中的写入功能
String uId = await userId();
final databaseRef = FirebaseDatabase.instance.ref('categories');
var data = await databaseRef.get();
var index = data.children.length;
await databaseRef.child('$index').set(<String, dynamic>{
"name": categoryBody.name,
"description": categoryBody.description,
"uid": uId,
"id": index,
});
错误
适用的规则有什么问题吗?
2条答案
按热度按时间fjaof16o1#
我试图复制您的问题,但我可以成功地测试规则没有错误。
您正在使用的规则适用于已验证的用户,但您正在测试未验证的用户。这意味着您尚未启用
Authenticated
字段。您必须输入
/categories/uid
而不是/categories
下的位置,您应该输入uid
下的Firebase UID
字段。您可能已经看到下面的屏幕截图。有关详细信息,请参阅此tutorial。
vuktfyat2#
当您使用以下安全规则时:
这意味着您允许用户对
categories/$uid
节点下的每个子节点进行读写操作。因此,当您尝试将这些规则应用于实际的数据库结构时,Firebase服务器会拒绝这些操作,因为它在数据库模式中找不到任何$uid
级别。要解决这个问题,必须从规则中删除额外$uid
级别,如下所示:这是因为这些类别对象直接存在于
categories
节点下,而不存在于categories/$uid
下。