代码之家  ›  专栏  ›  技术社区  ›  Nathan Jones

为什么这个firestore安全规则没有被执行?

  •  1
  • Nathan Jones  · 技术社区  · 5 年前

    我有以下消防规则。我正在使用带有服务帐户密钥的管理sdk来访问firestore。

    service cloud.firestore {
      match /databases/{database}/documents {
        match /users/{user} {
          allow read, delete: if true;
          allow update, write: if getAfter(/databases/$(database)/documents/users/$(request.resource.id)).data.AccountId is int;
        }
      }
    }
    

    我想强制执行 AccountId 字段作为 int users 集合,但我仍然可以在 记帐 是一个 string .

    我正在尝试验证 用户 收集。

    下面的代码将更新 user 文件:

    try {
      await db.collection('users').doc('1').set({
        AccountId: '1234'
      })
    
    } catch(e) {
      console.log(e)
    }
    

    这是不允许的,因为 记帐 不是int。

    try {
      await db.collection('users').doc('1').set({
        AccountId: 1234
      })
    
    } catch(e) {
      console.log(e)
    }
    

    这应该是允许的,因为 记帐 是INT。

    使用管理sdk,我可以设置 记帐 到A 一串 .

    编辑: 我已经更新了我的规则,我仍然可以写 记帐 作为一个 一串 .

    service cloud.firestore {
      match /databases/{database}/documents {
        match /users/{user} {
            allow read: if true;
            allow create, update: if request.resource.data.AccountId is int;
        }
      }
    }
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Doug Stevenson    5 年前

    管理sdk无条件地绕过所有安全规则。这些规则只适用于移动和网络客户端。如果代码做了正确的事情,就需要检查代码本身。