【问题标题】:Firestore update rule intervenes with createFirestore 更新规则干预创建
【发布时间】:2018-09-05 21:22:50
【问题描述】:

我希望用户能够创建消息(带有联系表单),但不允许他们阅读或更新。我正在添加一个新的联系人,如下所示:

app.firestore().collection("messages").add({
            name: this.state.name,
            subject: this.state.subject,
            message: this.state.message});

使用以下安全规则是允许的:

match /messages/{message}{
    allow read, delete: if request.auth.uid=="<SOME_ID>";
    allow create: if true;
}

但是当我添加如下更新规则时,添加新消息时出现权限不足错误。

match /messages/{message}{
    allow read, delete, update: if request.auth.uid=="<SOME_ID>";
    allow create: if true;
}

如果我将更新规则移到创建下方,这仍然不起作用。但是已经尝试将更新设置为“始终允许/真”,之后添加操作再次起作用。

因此,Firestore 似乎以某种方式查看了更新中最严格的规则并创建了规则,但前提是明确定义了更新规则。我在这里做错了吗?

编辑:

match /messages/{message}{
allow read, delete: if request.auth.uid=="<SOME_ID>";
allow create: if true;  allow update: if false  }

不会导致权限问题..所以行为似乎特定于我在这里所做的检查类型..

【问题讨论】:

  • 这令人困惑。更新规则根本不应该影响您显示的代码,因为它总是会创建一个具有新 ID 的新文档。更新仅适用于现有文档的修改。
  • 感谢您的回复,您认为这可能是一个错误吗?或者你对我的设置有什么建议吗?
  • 如果你有可靠的复制步骤,你可以提交一个错误。 firebase.google.com/support/contact/bugs-features
  • 我找到了解决办法,看答案

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


【解决方案1】:

对于那些将来遇到类似问题的人。问题是,请求不包含 auth 属性。出于某种原因,Firebase 正在检查更新案例的条件,并且正在测试:

request.auth.uid=="<SOME_ID>"

在后面这一定导致了一个:“试图读取null的属性uid”错误并崩溃。

function isAdmin() {
     return request.auth != null
            && request.auth.uid=="<SOME_ID>";
}
....
allow update: if isAdmin();

解决了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-09
    • 2019-07-28
    • 2020-06-19
    • 2019-01-15
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多