我有一个使用Firestore的Flutter应用程序,尚未使用Auth,即该应用程序将尝试未经身份验证的访问。一切似乎都正确配置,就像通常在Android和iOS上都能正常工作一样-我可以获取Eata。当我将访问规则更改为应该导致“访问被拒绝”的规则时,我只是看到一些奇怪的行为。
旁注:Firebase项目实际上已配置为将Firebase Auth与Google Sign In一起使用,并且可以在实际应用中使用,我只是完全删除了此代码以测试奇怪的行为。
应用程序:
import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
void main() {
runApp(
MaterialApp(
title: 'Test',
home: Screen(),
),
);
}
class Screen extends StatefulWidget {
@override
_ScreenState createState() => _ScreenState();
}
class _ScreenState extends State<Screen> {
StreamSubscription<dynamic> _sub;
@override
void initState() {
super.initState();
print('will start listening');
_sub = Firestore.instance.collection('categories').snapshots().listen(
(querySnapshot) {
print('>>> got data: $querySnapshot');
querySnapshot.documents.forEach((documentSnapshot) {
print('>>> ${documentSnapshot.data['name']}');
});
}, onError: (dynamic error) {
print('!!! got error: $error');
});
}
@override
void dispose() {
_sub?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container();
}
}
遵循以下规则;
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write;
}
}
}
它有效,我得到了数据。但是,当我将规则更改为:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
奇怪的事情#1:出于某种原因,我需要卸载应用程序并重新安装,否则我仍然可以获取数据(我正在使用iOS模拟器)。
奇怪的事情#2:当我再次卸载并安装该应用程序时,我没有得到任何数据,但是我也没有得到任何我期望的“访问被拒绝”错误。该应用程序已订阅,什么也没有发生,流也没有返回。
奇怪的事情#3:当我将规则更改为再次允许所有访问并再次启动应用程序时,它们又都可以工作了,我不必再次删除并安装应用程序。
(我确实在检查之间等待了一段时间,因为Firebase控制台告诉我,规则更改可能要花费一分钟才能生效。)
问题:
- 我是否应该得到某种指示,表明访问被拒绝?在这个示例应用程序中这还不错,但是在我的真实应用程序中,我没有办法知道我应该以某种方式做出反应并指导用户登录或进行其他操作。我根本没有任何错误,应用程序只是坐在那里,显示了加载指示器。我确实在Firebase控制台中看到“拒绝总数”增加了“监视规则”视图。
- 为什么即使更改了规则,应用程序仍会继续获取数据?为什么需要卸载?
我究竟做错了什么?