Правила Firbase - разрешать пользователям доступ только к своим данным - PullRequest
1 голос
/ 06 мая 2019

Я делаю приложение для Firebase Notes для Android в качестве проекта (я новичок и никогда не делал ничего подобного). Моя проблема на данный момент заключается в том, что каждая сделанная заметка, независимо от того, кто ее сделал, доступна для просмотра каждому пользователю. Я хочу сделать так, чтобы каждый пользователь мог только читать / писать свои собственные заметки, но все правила, которые я нашел и попробовал до сих пор, сделали так, чтобы никакие заметки не отправлялись в базу данных вообще или не показывались. Я тоже пытался поиграться с самим кодом, но все, что я делал, приводило к сбою приложения, но я открыт для предложений.
Проблема (вошел как пользователь 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);

                }
            });

Я хотел бы сделать так, чтобы каждый пользователь мог видеть, редактировать и удалять только те заметки, которые он сделал сам.

1 Ответ

0 голосов
/ 06 мая 2019

Я нашел решение, которое может пригодиться всем, кто испытывает проблемы с подобными вещами.
Я изменил путь в создании заметки к этому:

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