7

使用带有 angularfire2 rc 2 的 firestore。

在没有有效的安全规则的情况下,一切都在开发中运行良好。

这些是无安全规则——客户端代码将在$COLLECTION_NAME/document没有问题的情况下创建、更新和删除集合。

service cloud.firestore {
    match /databases/{database}/documents {
        match /collectionA/{userId=**} { 
            allow read, write: if true;
        }
        match /collectionB/{userId=**}  {
            allow read, write: if true;
        }
        match /collectionC/{userId=**}  {
            allow read, write: if true;
        }
        match /collectionD/{userId=**}  {
            allow read, write: if true;
        }
    }
}

我想去的地方是只允许用户访问他们自己的数据。

我从以下规则开始:

service cloud.firestore {
    match /databases/{database}/documents {
        match /collectionA/{userId=**} { 
            allow read, write: if request.auth.uid == userId;
        }
        match /collectionB/{userId=**}  {
            allow read, write: if request.auth.uid == userId;
        }
        match /collectionC/{userId=**}  {
            allow read, write: if request.auth.uid == userId;
        }
        match /collectionD/{userId=**}  {
            allow read, write: if request.auth.uid == userId;
        }
    }
}

但是,只要我添加任何类型的限制性规则,包括甚至只是验证请求都是授权的。

match /databases/{database}/documents {
    match /collectionA/{userId=**} { 
       allow read, write: if request.auth;
    }
    match /collectionB/{userId=**}  {
        allow read, write: if request.auth;
    }
    match /collectionC/{userId=**}  {
        allow read, write: if request.auth;
    }
    match /collectionD/{userId=**}  {
         allow read, write: if request.auth;
    }
}

我收到代码权限错误。

[code=permission-denied]:权限缺失或不足。

FirebaseError:权限缺失或不足。

每个 {userId} 文档都包含一个集合,该集合又包含文档,因此完整路径可能类似于

const entryCollection: AngularFirestoreCollection<Entry> = this.angularfirestore.collection('collectionC/' + user.uid + '/records' + '/2017-40' + '/entries');

应该对请求进行身份验证,因为只有在使用 firebase 身份验证进行身份验证后才在客户端授予访问权限。日志记录表明 uid 存在,并且确实在 collectionA 或 B 或 C 或 D 下创建文档时 user.uid 文档是使用 uid 命名的。

4

4 回答 4

8

简短的回答是{userId=**}结果userId是 apath而不是 a string。这意味着将其与request.auth.uid(字符串)进行比较将失败。相反,您可能会想要类似的东西:

service cloud.firestore {
    match /databases/{database}/documents {
        match /collectionA/{userId}/{allSubcollections=**} { 
            allow read, write: if request.auth.uid == userId;
        }
    }
}

这将保证这userId是一个字符串,然后匹配适当的子集合(请注意,再次allSubcollections将是 a path)。

于 2017-10-16T23:28:08.023 回答
4

就我而言,我还需要创建用户的权限,因此其他解决方案对我不起作用。我还必须允许访问 /users/{userId}。这是我的代码:

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, write: if request.auth.uid == userId;
      match /{allSubcollections=**} {
        allow read, write: if request.auth.uid == userId;
      }
    }
  }
}
于 2018-01-12T22:36:32.537 回答
2

以下设置对我有用(我使用allChildren过而不是allSubcollection):

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId}/{allChildren=**} {
      allow read, write: if request.auth.uid == userId;
    }
  }
}

allChildren将允许读/写用户文档的任何子集合。

有关此通配符匹配的更多信息,请点击此处

于 2017-11-15T16:51:56.597 回答
1

我像这样解决了这个问题。

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
       match /{allSubcollections=**} {
        allow read, write: if request.auth.uid == userId;
      }
    }
  }
}
于 2017-11-13T13:36:33.827 回答