适用于CRUD操作的Firestore安全规则React

时间:2020-05-02 10:16:39

标签: javascript reactjs firebase google-cloud-firestore firebase-security

我对Firebase还是比较陌生,并且一直在使用它将Firestore和身份验证与我正在使用的ReactJS应用集成。

我知道集合包含文档,而文档实际上包含键值对。我收集了一些歌曲,并且其中包含以下字段:-

  1. 创建的时间戳记

  2. 歌词

  3. 歌曲标题

我能够使用Firebase身份验证登录的用户在登录并创建新歌曲时获得该用户的UID,并以文档ID作为UID进入数据库。

仅当我将规则设置为

时,所有这些方法才有效
match /{document=**} {allow read, write:}

当我将规则更改为此时:-

rules_version = '2';
service cloud.firestore {

  match /databases/{database}/documents {
  match /songs/{songID} {
     allow read:  if request.auth!=null;
     allow write: if isValid();
  }

  function isValid(){
     return request.resource.data.uid == request.auth.uid;
  }}}

运行时出现以下错误。

Unhandled Rejection (FirebaseError): Missing or insufficient permissions.

我只想确保已登录的用户可以阅读,编写和更新他/她自己的歌曲,除此之外,别无其他。

1)我无法理解如何构建Firebase规则以实现此目的并防止权限错误。

2)如果我将文档ID用作UID,即5首歌曲的文档ID相同。由于特定用户的文档ID相同,我如何才能更新歌曲中的歌曲标题/歌词?

1 个答案:

答案 0 :(得分:1)

我无法理解如何构建Firebase规则以实现 这样可以防止权限错误。

以下规则可以解决问题:

rules_version = '2';
service cloud.firestore {

  match /databases/{database}/documents {

    match /songs/{songID} {
       allow read:  if request.auth.uid == resource.data.uid;
       allow write: if isValid();
    }

    function isValid(){
       return request.resource.data.uid == request.auth.uid;
    }
  }
}

我建议您观看嵌入在此文档页面中的非常清晰的视频:https://firebase.google.com/docs/firestore/security/get-started?authuser=0


如果我将文档ID用作UID,即 5首歌。我将如何更新歌曲标题/歌词 歌曲,因为特定用户的文档ID是否相同?

您不能对不同的Firestore文档使用相同的文档ID。根据定义,文档ID必须是唯一的。最好的办法是让Firestore生成文档ID(例如,使用add()方法),然后像您已经做过的那样在文档中添加作者uid(因为您已经request.resource.data.uid )。

然后,您可以构造查询以过滤与用户uid相对应的文档。例如:

var user = firebase.auth().currentUser;

var songsRef = db.collection("songs");
var mySongsQuery = songsRef.where("uid", "==", user.uid);