gpt4 book ai didi

firebase - Firebase身份验证和数据库规则

转载 作者:行者123 更新时间:2023-12-03 04:59:27 26 4
gpt4 key购买 nike

我是Flutter / Dart的新手,但是我一直在努力弄清我正在研究的项目的数据库规则。我知道在SO上有很多关于Firebase DB规则的文章,但是我发现并尝试过的所有方法都没有用。在下面的特殊情况下,我希望任何人都可以读取数据,但只有作者可以写入和编辑。我将文档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,因此规则将失败。

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

关于firebase - Firebase身份验证和数据库规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59888311/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com