尝试使用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默认包含身份验证数据?
这是用户数据库的代码段,密钥肯定等于用户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 */);
}