基于uid的Firebase实时数据库用户数据访问

wsewodh2  于 2022-11-17  发布在  其他
关注(0)|答案(2)|浏览(149)

我正在尝试创建一个规则,以便根据已验证的用户创建/访问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,
      });

错误

适用的规则有什么问题吗?

fjaof16o

fjaof16o1#

我试图复制您的问题,但我可以成功地测试规则没有错误。
您正在使用的规则适用于已验证的用户,但您正在测试未验证的用户。这意味着您尚未启用Authenticated字段。
您必须输入/categories/uid而不是/categories下的位置,您应该输入uid下的Firebase UID字段。您可能已经看到下面的屏幕截图。

有关详细信息,请参阅此tutorial

vuktfyat

vuktfyat2#

当您使用以下安全规则时:

"categories": {
  "$uid": {
    ".write": "auth != null && $uid === auth.uid",
    ".read": "auth != null && $uid === auth.uid"
  }
}

这意味着您允许用户对categories/$uid节点下的每个子节点进行读写操作。因此,当您尝试将这些规则应用于实际的数据库结构时,Firebase服务器会拒绝这些操作,因为它在数据库模式中找不到任何$uid级别。要解决这个问题,必须从规则中删除额外$uid级别,如下所示:

"categories": {
  ".write": "auth != null",
  ".read": "auth != null"
}

这是因为这些类别对象直接存在于categories节点下,而存在于categories/$uid下。

相关问题