我想做一些非常简单的事情,但是不确定用Firestore做到这一点的最佳方法。
我有一个ads
收藏。
每次访问ad
时,我都想更新accessed
属性时间戳,这样我就可以显示未在最长时间内显示的广告。
我的安全规则仅允许携带有效载荷为admin:true
的令牌的用户创建/修改ads
。
因此,由于用户不是管理员,因此无法在应用内每次访问广告时更新时间戳。
我曾考虑为此创建一个函数,但意识到没有onGet
函数可以让我做到这一点(https://firebase.google.com/docs/functions/firestore-events)
我仍然看不到允许任何用户修改单个属性。
在Firestore中执行此操作的合适方法是什么?
答案 0 :(得分:2)
您可以通过创建一个相当全面的规则验证来解决此问题,在此过程中,您要检查除accessed
以外的所有其他字段是否均未更改。您可以按照custom claims中的说明,使用the answer on this post来实现管理员角色概念。
要检查除accessed
以外的所有其他字段均未更改,需要您逐一列出并检查所有字段。
service cloud.firestore {
match /databases/{database}/documents {
match /ads/{id} {
allow read: if true;
allow write: if request.auth.token.admin == true
|| (request.resource.data.someField == resource.data.someField
&& request.resource.data.anotherField == resource.data.anotherField);
}
}
}
另一种方法是,您可以创建一个与callable cloud function类似的the Unix touch
command。您只需在每次阅读广告时都从客户端调用它,就可以安全地在该函数中更新帖子上的accessed
字段。
export const touchAd = functions.https.onCall((data, context) => {
const adId = data.id;
return admin.firestore().collection('ads').doc(adId).update({
accessed: firebase.firestore.FieldValue.serverTimestamp(),
}));
});