具有OR语句和与文档相关的身份验证数据的Angular Firestore权限

时间:2018-08-31 07:33:09

标签: angular firebase google-cloud-firestore angularfire2

尝试使用angularfire2运行Angular Firestore。在我的Firebase规则配置中,我有一个OR语句,并且能够使用published == true读取所有文档,但无法将isAdmin()标志设置为true并读取所有文档。我的Firestore服务器规则看起来像

service cloud.firestore {
  match /databases/{database}/documents {

    function isAdmin() {
      return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
    }

    match /myDocs/{myDoc} {
      allow read: if resource.data.published == true || isAdmin();
    }
  }
}

我也将/users/$(request.auth.uid)测试为没有成功的路径。 published==true标志的公共客户端查询看起来像

const myDocsCollection = this.db.collection('myDocs', ref => ref.where('published', '==', true));
const myDocs = myDocsCollection.snapshotChanges();

效果很好。但是我无法使基于身份验证的请求生效,因为它不依赖规则中的resource。对于这种情况,文档非常薄弱。

我尝试使用.where('auth', '==', firebase.auth().currentUser.uid),但这不起作用,并且没有太大意义。还仅测试了isAdmin()语句,没有其他任何内容,也没有where子句。它总是返回权限不足。我是否必须手动传递身份验证数据,或者Firebase默认包含身份验证数据?

Firestore users database

这是用户数据库的代码段,密钥肯定等于用户uid。在管理服务中,我要求使用

get(): Observable<MyDoc[]> {
  console.log(firebase.auth().currentUser); // returns user with correct uid
  const myDocsCollection = this.db.collection('myDocs');
  return myDocs = myDocsCollection.snapshotChanges().pipe(/* do some mapping, apply docid */);
}

0 个答案:

没有答案