【问题标题】:Firestore rules not allowing read given valid UIDFirestore 规则不允许读取给定的有效 UID
【发布时间】:2021-09-22 20:41:34
【问题描述】:

我编写了以下 firestore 规则,通过仅在调用者的 UID 与文档 ID 匹配时才允许请求来限制对用户集合的读取。用户集合的文档 ID 和 Firebase 身份验证中的 UID 之间存在奇偶校验。

    function isAuthenticated() {
      return request.auth.uid != null;
    }

    // Users collection
    match /users/{userId} {
      allow read: if isAuthenticated() 
        && request.auth.uid == userId;
    }

我在集合中有一个 ID 为 Eli90wRvWkfKcOfn1C4DBDqxQTz1 的文档。当使用相同的身份验证用户点击 Firestore 时,我收到以下错误:

如果我删除对request.auth.uid == userId 的检查,则会生成此规则并成功读取:

    // Users collection
    match /users/{userId} {
      allow read: if isAuthenticated();
    }

正在调用的查询是:

export const getUser = (uid: string) => {
  return db.collection('users').where('id', '==', uid).limit(1).get();
};

我看到很多人在他们的规则中使用 UID 检查,但为什么它在我的情况下不起作用?

【问题讨论】:

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


    【解决方案1】:

    您的安全规则与此代码匹配:

    db.collection('users').doc(uid).get();
    

    所以这里我们访问单个特定文档,文档 ID 是用户的 UID。


    如果您想在文档的某个字段中查询 UID,您可以使用以下规则来保护它:

    match /users/{doc} {
      allow read: if resource.data.id === request.auth.uid;
    }
    

    所以现在规则匹配您的原始代码,并且只允许读取uid 字段的值与当前用户的uid 匹配的文档。

    【讨论】:

    • 在这种情况下resource 是什么?我尝试按照您的建议更新规则,但它不适用于我最初编写的查询(使用 where 子句)。不过,您对查询的了解很有帮助!改为使用doc 可以解决问题。
    • resource 是安全规则正在考虑的文档。见firebase.google.com/docs/reference/rules/…。我看到我在字段名称中有错字,所以我现在修正了。
    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多