我有以下Firestore规则。我正在使用带有服务帐户密钥的Admin SDK来访问Firestore。
service cloud.firestore {
match /databases/{database}/documents {
match /users/{user} {
allow read, delete: if true;
allow update, write: if getAfter(/databases/$(database)/documents/users/$(request.resource.id)).data.AccountId is int;
}
}
}
我想将AccountId
字段中的int
强制为users
集合中的AccountId
,但是我仍然可以写(和批写),其中string
是{{ 1}}。
我正在尝试验证users
集合中每个文档中的数据。
以下是将更新user
文档的代码:
try {
await db.collection('users').doc('1').set({
AccountId: '1234'
})
} catch(e) {
console.log(e)
}
这是不允许的,因为AccountId
不是整数。
try {
await db.collection('users').doc('1').set({
AccountId: 1234
})
} catch(e) {
console.log(e)
}
应该允许这样做,因为AccountId
是一个整数。
使用Admin SDK,我可以将AccountId
设置为string
。
编辑:
我已经更新了规则,但仍然可以将AccountId
写为string
。
service cloud.firestore {
match /databases/{database}/documents {
match /users/{user} {
allow read: if true;
allow create, update: if request.resource.data.AccountId is int;
}
}
}
答案 0 :(得分:1)
Admin SDK无条件地绕过所有安全规则。该规则仅适用于移动和Web客户端。您需要检查代码本身是否在做正确的事。