Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Firebase规则-仅允许用户访问自己的数据_Java_Android_Firebase Realtime Database_Firebase Authentication_Firebase Security - Fatal编程技术网

Java Firebase规则-仅允许用户访问自己的数据

Java Firebase规则-仅允许用户访问自己的数据,java,android,firebase-realtime-database,firebase-authentication,firebase-security,Java,Android,Firebase Realtime Database,Firebase Authentication,Firebase Security,我正在为android制作firebase notes应用程序作为一个项目(我是一个初学者,从未做过类似的事情)。我目前的问题是,无论是哪位用户制作的每一张便条,都可以让每一位用户看到。我想让每个用户只能读/写他们自己的笔记,但我找到并尝试过的所有规则都使其完全不向数据库发送笔记或不显示笔记。我也试着玩弄代码本身,但我所做的一切都让应用程序崩溃了,但我愿意接受建议。 问题(以用户2身份登录): 包含两个用户和两个注释的数据库: 我在其他类似的帖子中也尝试过类似的解决方案: "ru

我正在为android制作firebase notes应用程序作为一个项目(我是一个初学者,从未做过类似的事情)。我目前的问题是,无论是哪位用户制作的每一张便条,都可以让每一位用户看到。我想让每个用户只能读/写他们自己的笔记,但我找到并尝试过的所有规则都使其完全不向数据库发送笔记或不显示笔记。我也试着玩弄代码本身,但我所做的一切都让应用程序崩溃了,但我愿意接受建议。
问题(以用户2身份登录):

包含两个用户和两个注释的数据库:

我在其他类似的帖子中也尝试过类似的解决方案:

    "rules": {
        "tasks": {
            "$userId": {
                ".read": "auth.uid == $userId",
                ".write": "auth.uid == $userId",
            }
        }
    }
}
但到目前为止,没有一个能正常工作

用户创建:

fAuth.createUserWithEmailAndPassword(电子邮件,密码)。添加OnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
fUserDatabase.child(fAuth.getCurrentUser().getUid()).child(“基本”).child(“名称”)
.setValue(名称).addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
progressDialog.disclose();
Intent maintent=新的Intent(RegisterActivity.this,MainActivity.class);
星触觉(主旨);
完成();
Toast.makeText(RegisterActivity.this,“用户创建”,Toast.LENGTH\u SHORT);
}否则{
progressDialog.disclose();
Toast.makeText(RegisterActivity.this,“错误:+task.getException().getMessage(),Toast.LENGTH\u SHORT);
}
}
}); 
}否则{
progressDialog.disclose();
Toast.makeText(RegisterActivity.this,“错误:+task.getException().getMessage(),Toast.LENGTH\u SHORT);
}
}
});
注释创建:
(不在同一页上)

editText=findviewbyd(R.id.etx);
etd=findViewById(R.id.etdx);
按钮=findViewById(R.id.btnx);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
DatabaseReference DatabaseReference=FirebaseDatabase.getInstance().getReference().child(“posts”).push();
Map Map=newhashmap();
put(“id”,databaseReference.getKey());
map.put(“title”,editText.getText().toString());
map.put(“desc”,etd.getText().toString());
databaseReference.setValue(map);
返回意图=新意图(NewNoteActivity.this,MainActivity.class);
星触觉(背);
}
});

我想让每个用户都只能看到、编辑和删除他们自己制作的笔记。

我找到了一个解决方案,可能对其他遇到此类问题的人有用
我将便笺创建中的路径更改为:

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("posts").push();

然后相应地更改了显示注释的代码部分
事情是这样的:

Query query = FirebaseDatabase.getInstance()
                .getReference()
                .child("posts");
现在是这样的:

Query query = FirebaseDatabase.getInstance()
                .getReference()
                .child("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("posts");

不能将数据保留为关系数据库。因为firebase数据库是平面层次结构。在设计数据库时,请始终使用

/users/user-id/posts 
                + item1
                + item2
这是您必须实施的方式。谢谢

Query query = FirebaseDatabase.getInstance()
                .getReference()
                .child("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("posts");
/users/user-id/posts 
                + item1
                + item2