我在规则集中定义了以下规则。
match /{document=**} {
allow read: if request.time < resource.data.end ;
allow read: if request.time > resource.data.end ;
allow read: if resource.data.start > request.time;
}
查询:
this.afs.collection<events>('events', ref => ref.where('end' , '>' , firestore.Timestamp.now())).snapshotChanges();
我不知道为什么Firebase引发权限错误:
ERROR FirebaseError:缺少权限或权限不足。
查询处:
this.afs.collection<events>('events', ref => ref.where('end' , '<' , firestore.Timestamp.now())).snapshotChanges();
Firebase不会引发任何错误,并允许读取。
谁能解释我为什么会出错?
更新
我正在开发一个应用程序,该程序显示从当前时间开始超过两天的数据库中的事件列表,并具有用于注册事件的选项。应用程序还会在“即将到来”部分显示用户注册的尚未开始的事件,并在“完成”部分显示已注册的事件。过去开始时间和将来开始时间(从现在开始超过3天)的事件不会显示在应用程序中。
之前,我使用的是客户端的系统时间,但是问题在于用户可以将设备时间更改为过去的时间以查看过去的所有事件,而用户可以将时间更改为未来的时间(从现在开始3天以上)以查看所有事件即将发生的事件。
稍后,我可以通过为数据库定义以下规则来防止时间作弊。
match /{document=**} {
allow read: if resource.data.start > request.time;
}
该规则可以防止时间作弊,但是仅凭这个规则,我在获取即将发生的事件(request.time
match /{document=**} {
allow read: if request.time < resource.data.end ;
allow read: if request.time > resource.data.end ;
allow read: if resource.data.start > request.time;
}
我能够获取已完成的事件,并为即将发生的事件留有权限错误。
答案 0 :(得分:0)
根据您在这里所说的话:
使用这些规则,我试图显示即将发生的事件(request.time
resource.data.end)
我只能说似乎根本就不需要安全规则。只需允许对要查询的集合中的所有文档进行读取访问,然后根据需要使用它们。仅当您要基于某些条件限制对文档的访问时,才需要安全规则。如果您只想执行无范围的范围过滤器,则不需要它们。