Как написать код общего предпочтения, который использует firebase для аутентификации пользователя? - PullRequest
0 голосов
/ 06 июня 2019

Как мне написать код с общими настройками, который использует Firebase для аутентификации пользователя, и данные, сохраненные пользователем, доступны только для них?Мое текущее приложение Сохраняет заметку и отображает ее, что является главным, что необходимо в моем проекте, но когда пользователь выходит из системы и новый пользователь входит в систему, он / она также может просматривать данные, поэтому данные не являются конфиденциальными.Мой сэр предложил создать узлы для пользователей, использующих общие предпочтения, но я не смог найти никаких решений

HomeActivity:

public class HomeActivity extends AppCompatActivity {

    EditText Descriptionholder;
    Button Savebtn;
    DatabaseReference DatabaseNote;
    ListView listViewNotes;

    List<PrivateNote> privateNoteList;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        DatabaseNote = FirebaseDatabase.getInstance().getReference("privatenote");
        Descriptionholder = findViewById(R.id.description2);

        Savebtn = findViewById(R.id.buttonsave);

        listViewNotes= findViewById(R.id.listViewPrivate);

        privateNoteList = new ArrayList<>();
        Savebtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                addnote();
            }

        });

        listViewNotes.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                PrivateNote privateNote = privateNoteList.get(i); //confusion

                showUpdateDialog(privateNote.getNoteId(),privateNote.getNoteDescription());
                return false;
            }
        });

    }
        public boolean onCreateOptionsMenu (Menu menu){
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.side, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected (MenuItem item){
            switch (item.getItemId()) {
                case R.id.item1:

                    FirebaseAuth.getInstance().signOut();
                    finish();

                    startActivity(new Intent(new Intent(this, MainActivity.class)));
                    Toast.makeText(this, "Logged out ", Toast.LENGTH_SHORT).show();

                    return true;
                default:
                    return super.onOptionsItemSelected(item);
            }
        }

    @Override
    protected void onStart() {
        super.onStart();

        DatabaseNote.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                        privateNoteList.clear();
                for (DataSnapshot privateSnapshot: dataSnapshot.getChildren() ){

                    PrivateNote privateNote = privateSnapshot.getValue(PrivateNote.class);

                    privateNoteList.add(privateNote);
                }
             PrivateList adapter = new PrivateList(HomeActivity.this,privateNoteList);
                listViewNotes.setAdapter(adapter);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    private void showUpdateDialog(final String noteId, String noteDescription){

        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);

        LayoutInflater inflater = getLayoutInflater();

        final View dialogview = inflater.inflate(R.layout.update_dialouge,null);

        dialogBuilder.setView(dialogview);

        final  EditText editDescription = dialogview.findViewById(R.id.editDescription);
        final Button buttonUpdate = dialogview.findViewById(R.id.buttonUpdate);
        final Button buttonDelete = dialogview.findViewById(R.id.buttonDelete);

        dialogBuilder.setTitle("Updating Note: " +noteDescription);

        final AlertDialog alertDialog = dialogBuilder.create();
        alertDialog.show();

        buttonUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String description = editDescription.getText().toString().trim();

                if (TextUtils.isEmpty(description)){
                    editDescription.setError(" New information required");
                    return;
                }
                    updatePrivateNote(noteId,description);

                    alertDialog.dismiss();
            }
        });

        buttonDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                deletePrivateNote(noteId);
            }
        });
    }

    private void deletePrivateNote(String noteId) {

        DatabaseReference drPrivateNote = FirebaseDatabase.getInstance().getReference("privatenote").child(noteId);

        drPrivateNote.removeValue();

        Toast.makeText(this, " Note Deleted", Toast.LENGTH_SHORT).show();

    }

    private boolean updatePrivateNote(String id,String description){

        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("privatenote").child(id);

        PrivateNote privateNote = new PrivateNote(id,description);

        databaseReference.setValue(privateNote);

        Toast.makeText(this, " Note Updated", Toast.LENGTH_SHORT).show();
        return true;
    }
    private void addnote () {

            String description = Descriptionholder.getText().toString().trim();

            if (!TextUtils.isEmpty(description)){

                //generated unique number for id
                String id = DatabaseNote.push().getKey();

                PrivateNote pNote = new PrivateNote(id, description);

                DatabaseNote.child(id).setValue(pNote); //pNote value added in id
                Toast.makeText(this, "Note added", Toast.LENGTH_SHORT).show();

            }

            else {

                Toast.makeText(this, " Please Enter a note ", Toast.LENGTH_SHORT).show();

            }
        }


    @Override
    public void onBackPressed() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Are you sure you want to exit?")
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        FirebaseAuth.getInstance().signOut();
                        finish();


                    }
                })
                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });
        AlertDialog alert = builder.create();
        alert.show();

    }

Адаптер:

public class PrivateList  extends ArrayAdapter<PrivateNote> {

    private Activity context;
    private List<PrivateNote> privateNoteList;



    public PrivateList(Activity context, List<PrivateNote> privateNoteList){

                super(context, R.layout.list_layout,privateNoteList);
                this.context =context;
                this.privateNoteList=privateNoteList;

    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

        LayoutInflater inflater = context.getLayoutInflater();
        View listViewItem = inflater.inflate(R.layout.list_layout,null,true);

        TextView textViewDescription = listViewItem.findViewById(R.id.TextViewDescription);

        PrivateNote privateNote = privateNoteList.get(position);

        textViewDescription.setText(privateNote.getNoteDescription());

        return listViewItem;

    }

}

PrivateNote:

public class PrivateNote {

   public String noteId;
    public String noteDescription;

    public PrivateNote(){

    }

    PrivateNote(String noteId, String noteDescription){

        this.noteId = noteId;
        this.noteDescription=noteDescription;
    }



    String getNoteId()
    {
        return noteId;
    }

    String getNoteDescription()
    {
        return noteDescription;
    }
}

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Поскольку вы используете проверку подлинности firebase, вы можете получить userId и создать следующую базу данных:

notes
  userId
      note        : "todo"
      description : "study"

Тогда вы можете сделать:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("notes");
FirebaseUser user     = FirebaseAuth.getInstance().getCurrentUser();
String userId         = user.getUid();
ref.orderByKey().equalTo(userId).addValueEventListener(new ValueEventListener() {...} 

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

0 голосов
/ 06 июня 2019

В Firebase есть две вещи:

  1. FirebaseDatabase

  2. FirebaseAuth

Обычно почти во всех приложениях пользовательские данные хранятся в FirebaseDatabase под ключом, который создается при создании нового пользователя в вашем приложении Firebase.

Так, например, ваша база данныхСтруктура будет выглядеть так.

-Your_main_database

 |____UserId_Of_FirebaseUser

      |____stuff_related_to_user

      |____More stuff related to user

Итак, вы создаете нового пользователя в FirebaseAuth, вы можете найти больше об этом ниже:

Firebase Custom Auth .

Затем, после создания нового пользователя, вы создаете дочерние узлы в своей базе данных с ключом = userId вашего текущего зарегистрированного пользователя.

например.В вашей функции addNote переменная id будет равна

String id = FirebaseAuth.getInstance().getCurrentUser().getUid();

В настоящее время вы используете нажимные клавиши, которые генерируются на основе метки времени, которую вы не сможете связать с пользователем, если тольковы добавляете ключ в объект заметки, в котором хранится текущее имя пользователя, а затем находите все дочерние узлы, содержащие это имя пользователя, но в этом случае ваши данные не будут организованы вообще.

Затем, после того как выСоздайте узел с userId в вашей основной базе данных, затем вы можете вставить новые заметки, созданные вашим пользователем, в userId с помощью функции push().Таким образом, ваша структура базы данных будет выглядеть следующим образом.

___
   |
   |__users
           |__uniqueUserId
           |              |__note1
           |              |__note2
           |__uniqueUserId2
                          |__note1
                          |__note2
                          |__note3

В следующий раз, когда вы захотите получить созданные пользователем заметки, вы войдете в систему, получите его идентификатор и затем найдете заметки, соответствующие этому идентификатору.

Я не вижу, как вы можете поместить туда SharedPreferences, до того как в Firebase также есть функция для кэширования данных в автономном режиме после их загрузки.

Защита заметок:

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

Общие правила базы данных .

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

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