Firestore数据验证规则无效



这是我关于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的用户,并且它实际上被添加到数据库中,这意味着我编写的安全规则不起作用。

我做错什么了吗

您的/users集合由两条规则覆盖:第二条规则显式地命名该集合,但第一条规则也适用于根目录下所有集合和子集合中的所有文档。

根据文档中关于重叠匹配语句的文档:

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

所以语句是"OR"而不是"AND"。既然你的第一条规则已经求值为true,那么第二条规则做什么就不再重要了。

你会想要删除/注释掉第一条规则,这样你的代码就会根据第二条规则进行检查。

最新更新