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

时间:2019-05-06 14:09:18

标签: java android firebase-realtime-database firebase-authentication firebase-security-rules

我正在作为项目开发用于Android的Firebase笔记应用程序(我是一个初学者,从未做过这样的事情)。我目前的问题是,无论用户使用哪种注释,每个注释都可供每个用户查看。我想让每个用户只能读/写他们自己的笔记,但是到目前为止,我找到并尝试过的所有规则都使其根本没有笔记发送到数据库或不显示。我也尝试过使用代码本身,但是我所做的一切都使应用程序崩溃了,但我乐于接受建议。
问题(以用户2登录):
enter image description here

具有两个用户和两个注释的数据库:

enter image description here

我尝试了其他类似帖子中的解决方案,例如:

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

但是到目前为止,没有一个能正常工作。

用户创建:

fAuth.createUserWithEmailAndPassword(email,password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {

                if (task.isSuccessful()) {

                    fUserDatabase.child(fAuth.getCurrentUser().getUid()).child("basic").child("name")
                            .setValue(name).addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {

                            if (task.isSuccessful()) {
                                progressDialog.dismiss();
                                Intent mainIntent = new Intent(RegisterActivity.this, MainActivity.class);
                                startActivity(mainIntent);
                                finish();
                                Toast.makeText(RegisterActivity.this, "User Created", Toast.LENGTH_SHORT);

                            } else {
                                progressDialog.dismiss();
                                Toast.makeText(RegisterActivity.this, "Error: " + task.getException().getMessage(), Toast.LENGTH_SHORT);
                            }
                        }
                    }); 

                } else {

                    progressDialog.dismiss();
                    Toast.makeText(RegisterActivity.this, "Error: " + task.getException().getMessage(), Toast.LENGTH_SHORT);
                }
            }
        });

注释创建:


(不在同一页面上)

editText = findViewById(R.id.etx);
        etd = findViewById(R.id.etdx);
        button = findViewById(R.id.btnx);


            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("posts").push();
                    Map<String, Object> map = new HashMap<>();
                    map.put("id", databaseReference.getKey());
                    map.put("title", editText.getText().toString());
                    map.put("desc", etd.getText().toString());


                    databaseReference.setValue(map);
                    Intent back = new Intent(NewNoteActivity.this, MainActivity.class);
                    startActivity(back);

                }
            });

我想这样做,以便每个用户只能看到,编辑和删除他们自己制作的笔记。

2 个答案:

答案 0 :(得分:0)

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

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");

答案 1 :(得分:0)

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

/users/user-id/posts 
                + item1
                + item2

这是您必须实现的方法。谢谢。