Firebase 身份验证和数据库规则

Part_Time_Nerd

我是 Flutter/Dart 的新手,但我一直在努力为我正在从事的项目找出数据库规则。我知道关于 Firebase DB 规则的 SO 上有很多帖子,但我发现和尝试的所有内容都没有奏效。在下面的特定情况下,我希望任何人都能够读取数据,但只有作者能够编写和编辑数据。我将 Doc ID 设置为 uid 并且在删除权限的情况下可以正常工作,但是当我添加受限规则时我无法获得任何工作。我究竟做错了什么?

堆栈跟踪消息

I/flutter (17900): PlatformException(Error performing setData, PERMISSION_DENIED: Missing or insufficient permissions., null)
E/flutter (17900): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: setState() called after dispose(): _RegisterState#1360e(lifecycle state: defunct, not mounted)

我的 Firebase 规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /brews/{userId} {
      allow read: if request.auth.uid != null;
      allow write: if request.auth.uid == userId;
    }
  }
}

数据库代码

class DatabaseService {
  final String uid;
  DatabaseService({this.uid});

  //Collection reference
  final CollectionReference brewCollection =
      Firestore.instance.collection('brews');

  Future updateUserData(String sugars, String name, int strength) async {
    return await brewCollection.document(uid).setData({
      'sugars': sugars,
      'name': name,
      'strength': strength,
    });
  }

  //brew list from snapshot
  List<Brew> _brewListFromSnapshot(QuerySnapshot snapshot) {
    return snapshot.documents.map((doc) {
      return Brew(
        name: doc.data['name'] ?? '',
        strength: doc.data['strength'] ?? 0,
        sugars: doc.data['sugars'] ?? '0',
      );
    }).toList();
  }

  //userData from snapshot
  UserData _userDataFromSnapshot(DocumentSnapshot snapshot) {
    return UserData(
      uid: uid,
      name: snapshot.data['name'],
      sugars: snapshot.data['sugars'],
      strength: snapshot.data['strength'],
    );
  }

  //Get the collection stream
  Stream<List<Brew>> get brews {
    return brewCollection.snapshots().map(_brewListFromSnapshot);
  }

  //get user doc stream
  Stream<UserData> get userData {
    return brewCollection.document(uid).snapshots().map(_userDataFromSnapshot);
  }
}

验证码:

class Authenticate extends StatefulWidget {
  @override
  _AuthenticateState createState() => _AuthenticateState();
}

class _AuthenticateState extends State<Authenticate> {
  bool showSignIn = true;
  void toggleView() {
    setState(() {
      showSignIn = !showSignIn;
    });
  }

  @override
  Widget build(BuildContext context) {
    if (showSignIn) {
      return SignIn(toggleView: toggleView);
    } else {
      return Register(toggleView: toggleView);
    }
  }
}

你的规则是正确的,你的更新功能是正确的。如果您执行 firebase 身份验证登录,您的身份验证代码不会向我们显示。

唯一可以阻止它工作的是如果您没有登录(通过 firebase 身份验证进行身份验证)或者您将错误的 uid 字符串传递给您的DatabaseService班级。如果是这种情况,您将不会有一个,request.auth.uid因此规则将失败。

您可以在控制台中测试您的规则,或者您可以尝试在代码中隔离确切的负载以向我们提供更多信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Firebase 身份验证和数据库

数据库的Firebase身份验证规则

Firebase 实时数据库规则在身份验证和数据发送后不起作用

如何使用经过身份验证的ID令牌和数据库规则保护Firebase Cloud Function HTTP端点?

Firebase身份验证数据库

如何从 Firebase 身份验证和数据库授予对特定 UID 的读/写访问权限

使电子邮件在Firebase身份验证和数据库之间保持同步

如何在Firebase中经过身份验证的用户和数据库之间链接?

Firebase数据库规则-允许未经身份验证的用户仅过滤查询

Firebase数据库规则+身份验证不起作用

用于电话身份验证的 Firebase 数据库安全规则

有关 Firebase 实时数据库身份验证规则的问题

Firebase 实时数据库 - 匿名身份验证规则

为什么从 Firebase 数据库检索数据不适用于用户身份验证规则但使用匿名规则?

将 Firebase 身份验证与 Firebase 数据库连接

Firebase 数据库的匿名身份验证权限被拒绝

Firebase实时数据库身份验证

Firebase数据库身份验证Swift

Firebase数据库规则,仅在document属性等于通过身份验证的用户ID时才允许删除

Firebase数据库安全规则允许经过身份验证的用户从自己的内容读取和写入

Firebase 数据库规则模拟器允许未经身份验证的用户读取和写入

Android Studio要求“更新Google服务插件或更新com.google.android.gms”以获取Firebase身份验证和数据库

Firebase数据库中电话身份验证和Facebook身份验证提供者的价值

用于Firebase实时数据库/ Firebase身份验证的Android唯一密钥

在没有 Firebase 身份验证的情况下保护 Firebase 数据库

具有一个Firebase身份验证的多个Firebase数据库

Firebase 数据库和 Firebase 身份验证中的不同 UID

Firebase 实时数据库和身份验证库版本不兼容

当我获得“ PERMISSION DENIED”时,如何让我的Firebase安全规则允许对我的实时数据库的身份验证访问