首页 > 解决方案 > CRUD 操作 React 的 Firestore 安全规则

问题描述

我对 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 相同,我如何能够更新歌曲中的歌曲标题/歌词?

标签: javascriptreactjsfirebasegoogle-cloud-firestorefirebase-security

解决方案


我无法理解如何构建 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。由于特定用户的文档 ID 相同,我如何能够更新歌曲中的歌曲标题/歌词?

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

然后,您可以构建过滤与 user 对应的文档的查询uid。例如:

var user = firebase.auth().currentUser;

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

推荐阅读