我正在尝试使用firebase数据库使用angularfire2构建博客应用程序,我希望允许用户读取其他用户发布的所有数据,但未成功,我不知道问题出在哪里。
数据库规则!
{
"rules": {
"report": {
"$uid": {
".read": "true",
".write": "$uid === auth.uid"
}
}
}
}
当我使用此规则时,用户不会阅读其他用户的所有帖子! ,只有我一个人可以阅读我的帖子。
主要代码
export class FeedPage {
itemsRef: AngularFireList<any>;
items: Observable<any[]>;
constructor(public navCtrl: NavController, public navParams: NavParams, public fire: AngularFireAuth
,public alertCtrl: AlertController,public toastCtrl: ToastController,public popoverCtrl: PopoverController,
public db: AngularFireDatabase)
{
// // Use snapshotChanges().map() to store the key
// this.items = this.itemsRef.snapshotChanges().pipe(
// map(changes =>
// changes.map(c => ({ key: c.payload.key, ...c.payload.val() }))
// )
}
ionViewWillLoad(){
this.fire.authState.subscribe(data => {
if(data && data.email && data.uid){
this.toastCtrl.create({
message : ` welcome ${data.email}`,
duration:2000
}).present()
this.itemsRef = this.db.list(`report/`+data.uid);
// Use snapshotChanges().map() to store the key
this.items = this.itemsRef.snapshotChanges().pipe(
map(changes =>
changes.map(c => ({ key: c.payload.key, ...c.payload.val() }))
)
);
}
})
}
}
数据库
{
"report" : {
"8D3sENaBcLaXoGNnh1MPuoyj5LP2" : {
"-LWl294Hs6YjkvJE5pqi" : {
"post" : "ali",
"title" : "dd"
},
"-LWlEonKLWfOttzirqp7" : {
"post" : "sas",
"title" : "ass"
},
"-LWlGvn81Kes2A-1UcC2" : {
"post" : "asa",
"title" : "asass"
}
},
"WUM2HBkGo8TFDeOjEqO1s3lCj1p1" : {
"-LWlHlhyS9m3ECS3wIdk" : {
"post" : "qwqsasasa",
"title" : "as"
},
"-LWlHmXZAJdSPZurO7ii" : {
"post" : "qwqsasasa",
"title" : "as"
}
}
}
}
如果我使用此代码检索数据,则得到空的html数据!
this.itemsRef = this.db.list(`report`);
如果我使用此代码检索数据,那么我只会得到我自己的帖子,而不会被所有其他用户获得。
this.itemsRef = this.db.list(`report/${data.uid}`);
答案 0 :(得分:3)
如果要允许所有用户阅读所有用户的所有帖子,则需要授予他们对整个/report
节点的访问权限。在您的安全规则中,您可以通过将".read": true
规则上移一级来做到这一点:
{
"rules": {
"report": {
".read": true,
"$uid": {
".write": "$uid === auth.uid"
}
}
}
}
但这意味着您还需要更新代码以侦听所有/report
,然后在此之下循环各个用户。
答案 1 :(得分:2)
正如我所说,我对angularfire并不满意,但是这条线
this.itemsRef = this.db.list(`report/${data.uid}`);
对我来说似乎是为仅登录的用户提取数据, 我认为可能需要
this.itemsRef = this.db.list(`report`);
然后遍历检索到的快照中的所有元素
更新
尝试将".read": true,
移到$uid
下方的reports
上方,
复制其他答案中的确切规则