You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 04:21:23