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 存储为实际布尔值更为习惯,因此我建议尽可能这样做。