Firebase 安全规则 (.read)
Firebase security rules (.read)
我对 Firebase 数据库安全规则有疑问。
我只想在申请中反映一些文件。
我试图在数据库中创建一个“已发布”字段,并确定该值是真还是假。
【Flutter/Dart代码】
class _HomePageState extends State<HomePage> {
late StreamSubscription<QuerySnapshot> subscription;
late List<DocumentSnapshot> snapshot;
CollectionReference collectionReference =
FirebaseFirestore.instance.collection('article');
passData(DocumentSnapshot snap) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => PostPage(snapshot: snap),
),
);
}
【在Cloud Firestore规则中】
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /article/{document=**} {
allow read:if resource.data.published == 'true';
}
}
}
【云火之城】
collection → article
field → published : false
如上案例,是否承认文件中的信息未反映在申请中?
我用Xcode模拟器查了一下,也反映出来了
我假设您的代码尝试读取 collectionReference
中的所有文档。如果是这种情况,那么您的规则将拒绝该阅读,因为他们说任何用户都只能阅读已发布的文档。
这里要理解的关键是 rules are not filters 本身,而只是确保任何操作只尝试读取允许读取的文档。
因此,为了让您的读取操作生效,您应该查询以仅请求已发布的文档。
大概是这样的:
collectionReference.where("publish", isEqualTo: "true");
请注意,我在这里将 'true'
作为字符串传递,因为这也是您的规则检查的内容。将 true/false 存储为实际布尔值更为习惯,因此我建议尽可能这样做。
我对 Firebase 数据库安全规则有疑问。
我只想在申请中反映一些文件。 我试图在数据库中创建一个“已发布”字段,并确定该值是真还是假。
【Flutter/Dart代码】
class _HomePageState extends State<HomePage> {
late StreamSubscription<QuerySnapshot> subscription;
late List<DocumentSnapshot> snapshot;
CollectionReference collectionReference =
FirebaseFirestore.instance.collection('article');
passData(DocumentSnapshot snap) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => PostPage(snapshot: snap),
),
);
}
【在Cloud Firestore规则中】
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /article/{document=**} {
allow read:if resource.data.published == 'true';
}
}
}
【云火之城】
collection → article
field → published : false
如上案例,是否承认文件中的信息未反映在申请中?
我用Xcode模拟器查了一下,也反映出来了
我假设您的代码尝试读取 collectionReference
中的所有文档。如果是这种情况,那么您的规则将拒绝该阅读,因为他们说任何用户都只能阅读已发布的文档。
这里要理解的关键是 rules are not filters 本身,而只是确保任何操作只尝试读取允许读取的文档。
因此,为了让您的读取操作生效,您应该查询以仅请求已发布的文档。
大概是这样的:
collectionReference.where("publish", isEqualTo: "true");
请注意,我在这里将 'true'
作为字符串传递,因为这也是您的规则检查的内容。将 true/false 存储为实际布尔值更为习惯,因此我建议尽可能这样做。