Разрешение правил безопасности Cloud Firestore - PullRequest
0 голосов
/ 15 января 2019

Как я могу регистрировать информацию о пользователях в базах данных и разрешать пользователю права на запись в базы данных во время регистрации.

service cloud.firestore {
match /databases/{database}/documents {
match /Users/{userId} {
  // Anybody can write to their ouser doc
  allow read, write: if request.auth.uid == userId;
    }
  }
}

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

image register.setOnClickListener (new View.OnClickListener () { @Override public void onClick (Просмотреть представление) {

            if(imageUri!=null){
                username_=username.getText().toString();
                name_=name.getText().toString();
                email_=email.getText().toString();
                pass_=password.getText().toString();
                location_=location.getText().toString();

                mDialog.show();

                if (TextUtils.isEmpty(username_)) {

                    AnimationUtil.shakeView(username, RegisterActivity.this);
                    mDialog.dismiss();

                }

                if (TextUtils.isEmpty(name_)) {

                    AnimationUtil.shakeView(name, RegisterActivity.this);
                    mDialog.dismiss();

                }
                if (TextUtils.isEmpty(email_)) {

                    AnimationUtil.shakeView(email, RegisterActivity.this);
                    mDialog.dismiss();

                }
                if (TextUtils.isEmpty(pass_)) {

                    AnimationUtil.shakeView(password, RegisterActivity.this);
                    mDialog.dismiss();

                }

                if (TextUtils.isEmpty(location_)) {

                    AnimationUtil.shakeView(location, RegisterActivity.this);
                    mDialog.dismiss();

                }

                if (!TextUtils.isEmpty(name_) || !TextUtils.isEmpty(email_) ||
                        !TextUtils.isEmpty(pass_) || !TextUtils.isEmpty(username_) || !TextUtils.isEmpty(location_)) {

                    firebaseFirestore.collection("Usernames")
                            .document(username_)
                            .get()
                            .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                                @Override
                                public void onSuccess(DocumentSnapshot documentSnapshot) {
                                    if(!documentSnapshot.exists()){
                                        registerUser();
                                    }else{
                                        Toast.makeText(RegisterActivity.this, "Username already exists", Toast.LENGTH_SHORT).show();
                                        AnimationUtil.shakeView(username, RegisterActivity.this);
                                        mDialog.dismiss();
                                    }
                                }
                            })
                            .addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception e) {
                                    Log.e("Error",e.getMessage());
                                }
                            });

                }else{

                    AnimationUtil.shakeView(username, RegisterActivity.this);
                    AnimationUtil.shakeView(name, RegisterActivity.this);
                    AnimationUtil.shakeView(email, RegisterActivity.this);
                    AnimationUtil.shakeView(password, RegisterActivity.this);
                    AnimationUtil.shakeView(location, RegisterActivity.this);
                    mDialog.dismiss();

                }

            }else{
                AnimationUtil.shakeView(profile_image, RegisterActivity.this);
                Toast.makeText(RegisterActivity.this, "We recommend you to set a profile picture", Toast.LENGTH_SHORT).show();
                mDialog.dismiss();
            }

        }
    });


}

private void registerUser() {

    mAuth.createUserWithEmailAndPassword(email_, pass_).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull final Task<AuthResult> task) {
            if (task.isSuccessful()) {

                Map<String,Object> usernameMap=new HashMap<String, Object>();
                usernameMap.put("username",username_);

                firebaseFirestore.collection("Usernames")
                        .document(username_)
                        .set(usernameMap)
                        .addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                task.getResult()
                                        .getUser()
                                        .sendEmailVerification()
                                        .addOnSuccessListener(new OnSuccessListener<Void>() {
                                            @Override
                                            public void onSuccess(Void aVoid) {

                                                final String userUid = task.getResult().getUser().getUid();
                                                final StorageReference user_profile = storageReference.child(userUid + ".png");
                                                user_profile.putFile(imageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                                                    @Override
                                                    public void onComplete(@NonNull final Task<UploadTask.TaskSnapshot> task) {
                                                        if (task.isSuccessful()) {

                                                           user_profile.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                                               @Override
                                                               public void onSuccess(Uri uri) {

                                                                   //noinspection deprecation
                                                                   String token_id = FirebaseInstanceId.getInstance().getToken();

                                                                   Map<String, Object> userMap = new HashMap<>();
                                                                   userMap.put("id", userUid);
                                                                   userMap.put("name", name_);
                                                                   userMap.put("image", uri.toString());
                                                                   userMap.put("email", email_);
                                                                   userMap.put("bio",getString(R.string.default_bio));
                                                                   userMap.put("username", username_);
                                                                   userMap.put("location", location_);
                                                                   userMap.put("token_id", "");

                                                                   firebaseFirestore.collection("Users").document(userUid).set(userMap).addOnSuccessListener(new OnSuccessListener<Void>() {
                                                                       @Override
                                                                       public void onSuccess(Void aVoid) {
                                                                           mDialog.dismiss();
                                                                           Toast.makeText(RegisterActivity.this, "Verification email sent", Toast.LENGTH_SHORT).show();
                                                                           finish();
                                                                       }
                                                                   }).addOnFailureListener(new OnFailureListener() {
                                                                       @Override
                                                                       public void onFailure(@NonNull Exception e) {
                                                                           mDialog.dismiss();
                                                                           Toast.makeText(RegisterActivity.this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                                                                       }
                                                                   });

                                                               }
                                                           }).addOnFailureListener(new OnFailureListener() {
                                                                       @Override
                                                                       public void onFailure(@NonNull Exception e) {
                                                                           mDialog.dismiss();
                                                                       }
                                                            });


                                                        } else {
                                                            mDialog.dismiss();
                                                        }
                                                    }
                                                });

                                            }
                                        })
                                        .addOnFailureListener(new OnFailureListener() {
                                            @Override
                                            public void onFailure(@NonNull Exception e) {
                                                task.getResult().getUser().delete();
                                            }
                                        });
                            }
                        })
                        .addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Log.e("Error",e.getMessage());
                            }
                        });


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

}

1 Ответ

0 голосов
/ 15 января 2019

Чтобы решить эту проблему, используйте следующие строки кода:

service cloud.firestore {
  match /databases/{database}/documents {
    match /Users/{userId} {
      allow read, update, delete: if request.auth.uid == userId;
      allow create: if request.auth.uid != null;
    }
  }
}

Это означает, что вы можете создать пользовательский документ, если request.auth.uid != null, и вы можете читать, обновлять, удалять, только если request.auth.uid == userId.

Edit:

Вы получаете это PERMISSION_DENIED предупреждение, потому что перед тем, как пытаться написать:

firebaseFirestore.collection("Users").document(userUid).set(userMap)

Вы также пытаетесь записать данные в:

firebaseFirestore.collection("Usernames").document(username_).set(usernameMap)

Там, где у вас нет разрешения. Пожалуйста, добавьте соответствующие разрешения для первой операции записи, и все будет хорошо.

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