如何限制对 Firestore 中用户拥有的文档的写入?

Posted

技术标签:

【中文标题】如何限制对 Firestore 中用户拥有的文档的写入?【英文标题】:How do I restrict writes to a document owned by a user in Firestore? 【发布时间】:2018-04-24 06:09:43 【问题描述】:

我有一些文章。

每篇文章都有一个参考字段,指向撰写该特定文章的作者的个人资料文档

经过身份验证的用户(使用 Firebase 的身份验证)将与这些配置文件相关联。

只有在当前登录用户拥有文章的情况下,我如何才能使这些文章可由当前登录的用户编辑?

在 Firestore 的文档中,有一个反复出现的例子:

service cloud.firestore 
  match /databases/database/documents 

    // Allows you to edit the current user document (like a user's profile).
    match /users/userId 
      allow read, write: if request.auth.uid == userId;
    

    // Allows you to read/write messages as long as you're logged in (doesn't matter who you're logged in as, so theoretically you could change other peoples' messages ????).
    match /rooms/roomId 
      match /messages/messageId 
        allow read, write: if request.auth != null;
      
    

  

如何构建和编辑某个用户拥有的文档的示例在哪里?

【问题讨论】:

【参考方案1】:

假设您有一个文件,例如owner: <uid>存储在里面,你可以这样做:

service cloud.firestore 
  match /databases/database/documents 
    match /somecollection/id 
      allow write: if resource.data.owner == request.auth.uid;
    
  

【讨论】:

我的文章文档没有owner: <uid>,它有owner: <Reference to another document>(即firestore.googleapis.com/project/xxxxxxxxx-eb000/database/(default)/documents/users/ajsidjasidjsaidjasidasj)。引用包含 uid。 Fwiw,我正在尝试您的建议,但它似乎不适用于参考。我怀疑我需要做一些get() 的东西,但不能让语法恰到好处...... :( 在处理用户信息时,我建议您将 uid 存储为字符串,只要您出于这个确切原因想要引用所有者 - 可能有其他方法可以做到这一点,但我不是确定这将如何工作。 谢谢迈克尔。显然 Firestore 不提供使用引用类型进行验证的方法(希望他们会添加这个,我已经打开了一个功能请求)...***.com/questions/46568850/…

以上是关于如何限制对 Firestore 中用户拥有的文档的写入?的主要内容,如果未能解决你的问题,请参考以下文章

Firestore - 对文档使用更新方法,但使用对象(Java)

在Firestore数据库中保存用户分数和收藏夹

如何读取 Firestore (Swift) 中字段的值

Android Firebase FireStore实时更新分页

Firebase Firestore 中一个集合下的文档数量限制

Vuejs 和 Firestore - 如何在 Firestore 中的数据更改时进行更新