【问题标题】:Firestore Rules For Admin管理员的 Firestore 规则
【发布时间】:2021-08-26 15:21:36
【问题描述】:

美好的一天! 为 Firestore 编写规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    function isSignIn() {
        return request.auth.uid != null
    }
  
    function isAdmin() {
        return exists(/databases/$(database)/documents/admins/$(request.auth.uid))
    }
    
    function isPublished() {
        return resource.data.published == true
    }

    match /instructions/{instructionId} {
      allow list:
        if isSignIn()
            &&  (isPublished() || isAdmin())
            &&  request.query.limit <= 10
    }
  }
}

我知道规则不是过滤器。我想达到一个条件,管理员可以查看已发布的帖子和未发布的帖子,而普通用户只能查看已发布的帖子。对published 的检查会强制在应用程序级别设置条件。

firestore.collection("instructions")
   .whereEqualTo("published", true)
   .limit(10)
   .get()

如果我们只想向普通用户显示已发布的帖子,原则上这是合乎逻辑的。

如何让管理员查看所有记录? 我只有一个选择 - 删除条件 isPublished () || isAdmin () 并在没有发布条件的情况下为管理员创建单独的视图。在这种情况下,必须在客户端进行验证,这是不好的。

你有什么建议?

【问题讨论】:

    标签: android firebase google-cloud-firestore firebase-security


    【解决方案1】:

    => 您可以通过在用户帐户上使用自定义声明来识别特权用户(它们来自context.auth 对象),而不是从文档中读取,从而为自己节省一些成本。它需要一些后端/云功能代码(自定义声明只能从特权/安全环境添加到用户令牌),但这是我广泛使用的方法 - 根本不信任客户端。最适合使用“登录”风格的权限方法,相对持久,因此您不会过于频繁地调用 Cloud Functions。

    => .whereEqualTo("published", true) 对客户端来说实际上是零成本 - 由于任何对未发布集的文档的请求都会失败,因此没有安全风险 - 格式正确的请求将成功;格式不正确/故意格式错误的请求将失败(因此,“规则不是过滤器”)。

    => isAdmin() 的单独规则是完全合理和预期的 - 如果任何规则匹配,则授予权限;它不必在 SAME 规则中。

    【讨论】:

    • 即可以制定两条规则? allow list: if isSignIn() &amp;&amp; isPublished() &amp;&amp; request.query.limit &lt;= 10allow list: if isSignIn() &amp;&amp; isAdmin() &amp;&amp; request.query.limit &lt;= 10 这有多真实?
    • 绝对。无论什么使它清晰。 Firebase/Firestore 只是检查规则,直到找到允许交易的规则。
    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2018-11-21
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多