【问题标题】:Cloud Firestore Security Rules permissionCloud Firestore 安全规则权限
【发布时间】:2019-01-15 12:46:57
【问题描述】:

如何将用户信息登录到数据库并在注册期间启用用户写入数据库的权限。

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;
    }
  }
}

我无法注册有这些限制的用户,如何设置好的限制来启用确认邮件后的日志信息?

 register.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

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

验证电子邮件

                       @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();
          }
         }
        });

       }


【问题讨论】:

    标签: java android firebase firebase-security


    【解决方案1】:

    要解决这个问题,请使用以下代码行:

    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 时您才能读取、更新、删除。

    编辑:

    您收到 PERMISSION_DENIED 警告是因为在尝试写入之前:

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

    您还尝试将数据写入:

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

    您没有权限的地方。请给第一次写操作加上相应的权限,一切都会好起来的。

    【讨论】:

    • 当您注册时,收到此警告 E/Error: PERMISSION_DENIED: Missing or enough permissions。 V / FA:不活动,与服务断开连接注册:实时数据库正常注册:cloud firestory不成功!
    • 在这种情况下,请添加您用于将用户添加到数据库的代码以及您的数据库架构的屏幕截图。
    • 我在问题中添加了照片,我不能在评论中添加它吗?
    • 不客气。关于验证部分,您应该发布另一个新问题,以便知道该答案的人可以帮助您。
    • 好吧,如果我不能解决问题,我会发布一个新问题,非常感谢您
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2020-08-21
    • 2020-03-22
    • 2018-07-07
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多