firebase 用于内容所有者访问的Firestore规则

igetnqfo  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(130)

因此,当我试图设置规则时,firestore规则出现问题,只有在集合中创建文档的人才能读写它。当我试图设置它们时,我总是被拒绝权限。这些是我目前的规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
   
    match /users/{uid} {
        allow read, write: if request.auth != null && request.auth.uid == uid;
    }
    
    match /accounts/{document} {
      allow read, write: if request.auth != null && request.auth.uid == resource.data.userId
    }
  }
}

我有两个集合,如上所示。我已经尝试了这些规则的许多变体,以便允许在accounts集合中创建文档的人看到它,而其他用户则无法看到,但我总是被拒绝权限。我在文档中有一个字段,可以获取userId和username,但不确定实际问题是什么。如果是flutter代码中的某些内容导致了它,这是我如何设置StreamBuilder的:

StreamBuilder(
        stream: FirebaseFirestore.instance
            .collection('accounts')
            .orderBy('siteName')
            .snapshots(),

**编辑:**我发现将其作为子集合并使用这些规则是有效的!

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
  
    match /users/{uid} {
        allow read, write: if request.auth != null && request.auth.uid == uid;
    }
   
    match /users/{uid}/accounts/{document=**} {
        allow read, write: if request.auth != null && request.auth.uid == uid;
    }
    
  }
}

如果有更好的做法,或者如果有人能指导我什么是问题原来仍然,我将不胜感激!

xtfmy6hx

xtfmy6hx1#

Firebase安全规则不过滤数据,而只是确保您的代码不会尝试读取任何未经授权的数据。
知道了这一点,我们可以看到这段代码不符合规则的要求:

FirebaseFirestore.instance
        .collection('accounts')
        .orderBy('siteName')
        .snapshots(),

为了满足规则的要求,代码必须只请求当前用户的文档。因此,类似于:

FirebaseFirestore.instance
        .collection('accounts')
        .orderBy('siteName')
        .where('uid', isEqualTo: FirebaseAuth.instance.currentUser.uid)
        .snapshots(),

相关问题