【问题标题】:Firestore data validation rule does not workFirestore 数据验证规则不起作用
【发布时间】:2021-08-23 13:43:59
【问题描述】:

这是我关于stackoverflow的第一个问题。

我正在尝试编写一些简单的 Firestore 安全/数据验证规则,以防止创建年龄小于 18 岁的用户。

这是我到现在为止的:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if
          request.time < timestamp.date(2021, 9, 22);
    }

    match /users/{user} {
      allow create: if request.resource.data.age > 18;
    }
  }
}

我用来向 Firestore 写入数据的代码如下:

const firebase = require('firebase');

require('firebase/firebase-firestore');

const firebaseConfig = {/* firebase api keys */}

firebase.initializeApp(firebaseConfig);

const Firestore = firebase.firestore();

Firestore.collection('users')
  .add({
    first_name: 'Laura',
    last_last: 'Waterson',
    age: 5,
  })
  .then((docRef) => {
    console.log('Document written with ID: ', docRef.id);
  })
  .catch((error) => {
    console.error('Error adding document: ', error);
  });

如您所见,我添加了一个年龄等于 5 的用户,它实际上已添加到数据库中,这意味着我编写的安全规则不起作用。

我做错了吗?

【问题讨论】:

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


    【解决方案1】:

    /users 集合包含两条规则:第二条明确命名集合的规则,以及适用于根目录下所有集合和子集合中的所有文档的第一条规则。

    根据文档中overlapping match statements上的文档:

    一个文档可以匹配多个匹配语句。在多个允许表达式匹配一个请求的情况下,如果任何条件为真,则允许访问:

    所以这些语句是 OR'ed 在一起的,而不是 AND'ed。由于您的第一条规则已经评估为 true,因此您的第二条规则的作用不再重要。

    您需要删除/注释掉第一条规则,以便根据第二条规则检查您的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-21
      • 2013-12-01
      • 2018-03-12
      • 1970-01-01
      • 2020-07-09
      • 2021-02-27
      • 2015-04-04
      相关资源
      最近更新 更多