所以我的 flutter 代码工作正常,直到我改变我的 Firebase Realtime Database 规则。它不会在调试控制台或任何东西中引发错误,但应用程序不会获取数据。我附上我的规则和登录方法。
"rules": {
"$uid": {
".read": "auth.uid == $uid || auth.request.uid == $uid",
".write": "auth.uid == $uid || auth.request.uid == $uid"
}
}
和:
void authUser(String email, String password, bool isLogin,
String username) async {
setState(() {
isLoading = true;
});
UserCredential userCreadencial;
FocusScope.of(context).unfocus();
try {
if (isLogin == false) {
userCreadencial = await firebaseAuth.createUserWithEmailAndPassword(
email: email,
password: password,
);
} else {
userCreadencial = await firebaseAuth.signInWithEmailAndPassword(
email: email,
password: password,
);
}
FirebaseFirestore.instance
.collection('users_info')
.orderBy(userCreadencial.user!.uid, descending: true);
await FirebaseFirestore.instance
.collection('users_info')
.doc(userCreadencial.user!.uid)
.set({
'email': userCreadencial.user!.email,
'username': username,
});
setState(() {
isLoading = false;
});
} on PlatformException catch (err) {
print(err);
var message = 'An error occurred, pelase check your credentials!';
if (err.message != null) {
message = err.message!;
}
Scaffold.of(context).showSnackBar(
SnackBar(
content: Text(message),
backgroundColor: Theme.of(context).errorColor,
),
);
setState(() {
isLoading = false;
});
} catch (e) {
print(e);
setState(() {
isLoading = false;
});
rethrow;
}
}
回答1
您的 dart 代码显示您使用 https://firebase.google.com/docs/firestore,但您的规则对应于 https://firebase.google.com/docs/database Firebase 提供的这两种不同的 NoSQL 数据库服务使用不同的安全规则句法。
您应该使用 https://firebase.google.com/docs/firestore/security/overview 并在正确的位置编辑您的规则:
- 通过 https://console.firebase.google.com/u/0/ 通过“Firestore 数据库”垂直菜单项,而不是“实时数据库”垂直菜单项
- 或者通过修改您的 Firebase 项目(位于您的计算机上)的
firebase.json
文件中配置的正确规则文件,请参见下文。
对于如下所示的 firebase.json
中的默认项目配置,您应该在 firestore.rules
文件中定义 Firestore 规则。
{
"database": {
"rules": "database.rules.json"
},
"firestore": {
"rules": "firestore.rules",
"indexes": "firestore.indexes.json"
},
...