我有一个使用Google帐户登录的用户,并且在firebase中,用户ID为“ 123”
在firestore:数据中,存在一个名为“用户”的集合,其中包含一个文档为“ 123”且字段为“ name:“ test”'
在“ firestore:规则”中,规则如下
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read, update, write, delete: if request.auth.uid == userId;
}
}
}
在我的组件中,我的代码是:
users: Observable<User[]>;
ngOnInit()
{
this.users = this.firestore.collection<User>('users');
}
constructor(public auth: AngularFireAuth, private firestore : AngularFirestore) {}
HTML:
<ul>
<li *ngFor='user of angObs | async>
{{ user.name }}
<li>
<ul>
<div *ngIf='auth.user | async as user'>
<p>User id:</p>
{{ user.uid }}
</div>
hmtl读取:
用户ID:
123
当规则为request.auth.uid != null;
时,用户将看到数据。
当规则为request.auth.uid == userId;
时,用户看不到数据。
我在做什么错?
答案 0 :(得分:3)
您正在查询整个用户集合,因此无法通过此测试,因为您的userId需要匹配每个文档ID。
您需要指定文档的补丁,例如:
this.users = this.firestore.collection('users').doc<User>(userId).get()
那只会导致单个用户文档而不是User[]
如果您尝试查询整个用户集合,例如您的
users: Observable<User[]>;
您需要将自定义属性添加到确定权限的用户对象