我正在创建一个博客应用程序,用户可以在使用其帐户登录后在其中发布信息。我的问题是我希望能够显示所有用户的所有博客。在所有具有其Uid的用户下,都有一个名为Blog的孩子,我想在其仪表板上显示它,因此当用户使用其帐户登录时,他们可以看到其他用户的Blog。我希望这个问题很清楚。任何人都可以帮助我。谢谢。
这是我的代码,但是这使我拒绝了错误许可,
private void loadPost() {
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("users").child("Blog");
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
postList.clear();
for (DataSnapshot ds: dataSnapshot.getChildren()){
ModelPost modelPost = ds.getValue(ModelPost.class);
postList.add(modelPost);
adapterPost = new AdapterPost(getActivity(), postList);
recyclerView.setAdapter(adapterPost);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toast.makeText(getActivity(), ""+databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
这是我的数据库。
这是我的数据库安全规则
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
答案 0 :(得分:1)
您的代码尝试从此getReference("users").child("Blog")
中读取内容,这有两个问题:
/users/Blog
上没有数据。/users/Blog
。您的规则允许用户阅读自己的节点,包括博客文章和个人资料信息。要阅读用户自己的博客文章,您可以听:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("users").child(uid).child("Blog")
请注意,这不允许用户阅读所有用户的所有博客文章。实际上,在您当前的模型中,如果不授予访问者读取所有用户配置文件的权限,那是不可能的。我认为这不是您想要的。
如果要允许用户阅读所有博客文章,但仅允许他们访问自己的个人资料,则需要创建两个单独的顶级节点:
profiles: {
uid1: {
}
uid2: {
}
}
blogs: {
uid1: {
blogid1: { ... }
blogid2: { ... }
}
uid2: {
blogid3: { ... }
blogid4: { ... }
}
}
或者,您可以将最后一个结构中的博客建模为:
blogs: {
blogid1: { uid: "uid1". ... }
blogid2: { uid: "uid1". ... }
blogid3: { uid: "uid2". ... }
blogid4: { uid: "uid2". ... }
}
无论哪种情况,您现在都可以通过以下方式允许访问:
"rules": {
"profiles": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
},
"blogs": {
".read": true"
}
}