Agu*_*ana 4 firebase firebase-security google-cloud-firestore
我的 Firestore 文档中有一个字段,lastApproval如果它有值,则该字段应该是时间戳。
这是我的简化规则
match /users/{userID} {
allow create: if isValidUserStructure(incomingData())
allow update: if isValidUserStructure(incomingData())
}
function incomingData() {
return request.resource.data;
}
function isValidUserStructure(user) {
return user.email is string
&& user.fullname is string
&& user.lastApproval is timestamp // error in here
}
Run Code Online (Sandbox Code Playgroud)
如您所见,isValidUserStructure函数将用于在创建和更新用户文档时进行检查。
创建用户文档时,该lastApproval字段将为空,如下所示
const data = {
fullname: 'John Doe',
email: 'my@email.com',
lastApproval: null
};
await db.collection('users').doc('userIDHere').set(data);
Run Code Online (Sandbox Code Playgroud)
但在更新文档时,我只想要时间戳。
const data = {
lastApproval: new Date()
};
await db.collection('users').doc('userIDHere').update(data);
Run Code Online (Sandbox Code Playgroud)
而且,如果不可用,我想传递安全规则lastApproval,例如,如果用户只想像这样更新全名
const data = {
fullname: "My New Name"
};
await db.collection('users').doc('userIDHere').update(data);
Run Code Online (Sandbox Code Playgroud)
所以我希望我的安全规则接受lastApproval字段的时间戳、空值和未定义值
我已经尝试过但错误
请帮忙 :)
null据我所知没有任何类型。您可以在文档中找到所有可用的类型。
如果您想检查该值是否为空,请尝试user.lastApproval == null改为。要检查该lastApproval 属性是否首先存在,请尝试以下操作:
match /collection/{doc} {
allow write: if 'lastApproval' in request.resource.data && (..otherLogic)
}
Run Code Online (Sandbox Code Playgroud)
所以你可以将你的函数写为:
function isValidUserStructure(user) {
return user.email is string
&& user.fullname is string
&& (('lastApproval' in user && user.lastApproval is timestamp) || !('lastApproval' in user))
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1244 次 |
| 最近记录: |