【问题标题】:Firebase rules - allow users access only their own dataFirebase 规则 - 只允许用户访问自己的数据
【发布时间】:2019-09-24 04:32:32
【问题描述】:

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

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

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

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

                }
            });

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您不能将数据保存为关系数据库。因为firebase数据库是扁平的层次结构。当你设计数据库时总是使用

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

      这是您必须实施的方式。谢谢。

      【讨论】:

        猜你喜欢
        • 2017-10-29
        • 1970-01-01
        • 2017-03-10
        • 2018-10-22
        • 1970-01-01
        • 1970-01-01
        • 2018-03-18
        • 1970-01-01
        • 2016-12-23
        相关资源
        最近更新 更多