在Android Firebase中实施基于用户的安全性

时间:2018-03-14 18:03:56

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

以用户身份登录我的应用程序时,我希望所述用户可以访问他们自己的特定维护记录。据推测,这可以使用用户使用Firebase Auth签署应用程序后生成的UID来完成。

MaintenanceActivity

   private boolean updateMaintenance(String title, String desc, String id, String primary, String secondary, String property) {

        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("maintenance").child(id);
        Maintenance maintenance = new Maintenance (id, title, desc, primary, secondary, property);

        databaseReference.setValue(maintenance);

        Toast.makeText(this, "Maintenance Updated Updated Successfully", Toast.LENGTH_LONG).show();

        return true;
    }

    private void addMaintenance(){

        String title = editTextTitle.getText().toString().trim();
        String desc = editTextDesc.getText().toString().trim();
        String primary = spinnerPrimary.getSelectedItem().toString();
        String secondary = spinnerSecondary.getSelectedItem().toString();
        String property = spinnerProperty.getSelectedItem().toString();

        if(!TextUtils.isEmpty(title)){

            String id = databaseMaintenance.push().getKey();

            Maintenance maintenance = new Maintenance (id, title, desc, primary, secondary, property);

            databaseMaintenance.child(id).setValue(maintenance);

            Toast.makeText(this, "Maintenance Added", Toast.LENGTH_LONG).show();

        } else {

            Toast.makeText(this, "You must enter a maintenance record", Toast.LENGTH_LONG).show();
        }

    }

LoginActivity

这是我目前实施的内容。目前,我可以使用Firebase存储的凭据登录,但始终会显示Firebase数据库中保存的维护记录。无论谁登录。

Auth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {

            if(task.isSuccessful()){

                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
            } else {
                Toast.makeText(getApplicationContext(), task.getException().getMessage(), Toast.LENGTH_SHORT).show();
            }

        }
    });

数据库规则

我已将数据库规则设置如下:

    {
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid",
        ".read": "$uid === auth.uid"
      }
    }
  }
}

当前的Firebase数据库

这些是以任何用户身份登录时显示的维护案例。

enter image description here

不确定此处是否需要维护活动代码,如果是,则确定哪些部分。

对此的任何帮助都将受到大力赞赏,现在已经坚持了很长时间。

非常感谢。

1 个答案:

答案 0 :(得分:0)

仅获取firebase中登录的用户记录..

首先在Firebase控制台中添加安全规则。

  match /databases/{database}/documents {
    match /maitenance/{userId} {
      allow read, write: if request.auth.uid == userId;
    }
  }

然后,您需要添加用户ID节点作为维护节点的子节点,用户维护记录应该是登录用户ID节点的子节点。

最后,在read操作中传递用户id以获取用户id的维护记录。

  firestoreDB.collection("maintenance")
            .whereEqualTo("userId", userId)
        .get()

请查看user specific data is saved in and fetched from firestore database的方式。您也可以使用实时数据库。