如何用Firestore规则基于自定义声明和文档日期限制用户访问?
问题解答
是的,你那样组合规则会把管理员也限制在近3个月的文档范围内。因为管理员的isModerator声明同样为true,规则会同时校验isModerator()和isNewerThan3Months()两个条件,导致管理员也无法读取3个月前的文档。
正确的规则写法
你需要用**逻辑或(||)**来区分管理员和版主的权限:管理员直接跳过时间校验,版主则需要满足时间条件。另外要注意:create操作时resource对象还不存在,不能调用resource.data.createdAt,所以要把read和create/update的权限分开配置:
match /invoices/{invoiceId} { // 管理员可读取所有文档,版主仅能读取近3个月内的文档 allow read: if isAdmin() || (isModerator() && isNewerThan3Months()); // 创建、更新操作对管理员和版主开放(创建时无createdAt字段,无需时间限制) allow create, update: if isModerator(); } function isAdmin() { return request.auth.token.isAdmin == true; } function isModerator() { return request.auth.token.isModerator == true; } function isNewerThan3Months() { return request.time < resource.data.createdAt + duration.value(90, 'd'); }
补充说明
- 由于管理员同时拥有
isModerator声明,create/update权限用isModerator()就足够覆盖两类用户。 read权限拆分后,只要isAdmin()为真就直接通过校验,只有版主会触发isNewerThan3Months()的时间限制。
内容的提问来源于stack exchange,提问作者Owenn
相关产品推荐
相关产品推荐

