如果uid与写入uid匹配,则授权读取-实时数据库



我有一个功能强大的应用程序,用户可以在其中注册/登录、上传图像和查看自己已经上传的图像,但他们看不到其他人的图像,反之亦然。因此,我的规则是请求用户的UID=上传图像的用户的UID。

这是代码:

package com.example.auth;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
public class ShowActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private ArrayList<Model> list;
private MyAdapter adapter;
private DatabaseReference root = FirebaseDatabase.getInstance().getReference("Image");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show);
recyclerView = findViewById(R.id.recyclerview);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
list = new ArrayList<>();
adapter = new MyAdapter(this , list);
recyclerView.setAdapter(adapter);

root.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot : snapshot.getChildren()){
Model model = dataSnapshot.getValue(Model.class);
list.add(model);
}
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}

以下是相应的实时数据库规则。

{
"rules": {
"users": {
"$uid": {
".write": "$uid === auth.uid",
".read": "$uid === auth.uid"
}
}
}
}

将用户的UID与上传图像的用户的UID进行比较应该是一个相当简单的修复,但是我的尝试没有成功。感谢您的帮助。

在以下引用下添加Model对象时:

DatabaseReference root = FirebaseDatabase.getInstance().getReference("Image");

然后确实需要一个查询来获取与特定用户相对应的对象。如果不想这样,那么你可以稍微重组一下数据库,这样你就可以准确地指向用户图像:

Firebase-root
|
--- images
|
--- $uid
|
--- $modelId
|
--- //data

这意味着您将能够非常快速地获取数据,因为当您不使用查询时,就不需要进行任何比较。

现在,要读取对应于特定用户的对象,您只需要使用以下引用:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference db = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = db.child("images").child(uid);
uidRef.addValueEventListener(/* .../*);

除此之外,您添加的规则只允许用户在users/$uid下读取和写入数据,并且确实会拒绝您在images下执行的任何操作。因此,如果你想允许用户只读取和写入自己的数据,那么你还应该添加另一条规则来允许:

{
"rules": {
"images": {
"$uid": {
".write": "$uid === auth.uid",
".read": "$uid === auth.uid"
}
},
//Other rules
}
}

您还应该在相应的文档中保存用户的唯一id。

然后,您可以查询包含与请求用户相同的uid的文档。查询应该是这样的。

root.whereEqualTo("uid", auth.currentUser?.uid).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot : snapshot.getChildren()){
Model model = dataSnapshot.getValue(Model.class);
list.add(model);
}
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});

相关内容

  • 没有找到相关文章

最新更新