我遇到一个问题,我的 Firebase Firestore 规则拒绝经过身份验证的用户对数据库的请求。我不太熟悉 Firestore 规则,所以这很可能是我做错了。
这是我的 Firestore 规则:
service cloud.firestore {
match /databases/{database}/documents {
match /{userID} {
allow read: if request.auth.uid == userID;
allow write: if request.auth.uid == userID
}
match /payment_options{
allow read: if request.auth != null;
allow write: if false
}
match /logs{
allow read, write: if false
}
}
}
检查随附的图片以获取我的 Firestore 数据的快照,其中红线代表从 Firebase 身份验证检索到的用户 ID。
我正在使用 Flutter Firestore 和 Firebase Auth SDK,并且我确保仅在用户登录 flutter 应用程序后获取/设置数据库文档,但我不断收到以下异常:
Exception:
[cloud_firestore/permission-denied] The caller does not have permission to execute the specified
operation.
这是我的应用程序树,它侦听身份验证状态更改,如果用户未登录,则将其路由到登录页面,并在登录后将其路由到主页(Firestore 操作仅在主页之后发生):
class AppTreeWidgetState extends State<AppTreeWidget > {
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: Auth.currentUserStream,
builder: (context, snapshot){
if(snapshot.hasData) {
//TODO: Tell firebase to use the Signed in user to authenticate requests
//to the Firestore Database
return const MainPage();
} else {
return const LoginScreen();
}
}
);
}
}
任何帮助或指示来启动并运行此程序将不胜感激!
我预计 Auth 和 Firestore SDK 会互操作,并且一旦用户使用 Firebase Auth SDK 登录,我的 Firestore 调用就已经经过身份验证 - 我在这里错了吗?我是否需要使用从用户登录中检索到的信息显式授权对 Firestore 数据库的调用?
我不确定你是如何打电话的以及你的数据怎么样。 但如果您确定用户已成功通过身份验证,则在调用数据库时无需将其他信息传递给 firebase,因为身份验证状态始终自动附加到请求。
我的建议是使用
{documents=**}
它是一个通配符,可以匹配指定路径中的任何文档。
service cloud.firestore {
match /databases/{database}/documents {
match /{userID}/{documents=**} {
allow read: if request.auth.uid == userID;
allow write: if request.auth.uid == userID
}
match /payment_options/{documents=**} {
allow read: if request.auth != null;
allow write: if false
}
match /logs/{documents=**} {
allow read, write: if false
}
}
}
因为我在这里没有看到确切的实现。 如果没有解决,那么您需要提供额外的实施细节。