【问题标题】:Implementing user-based security in Android Firebase在 Android Firebase 中实现基于用户的安全性
【发布时间】:2018-08-23 09:36:55
【问题描述】:

当以用户身份登录我的应用程序时,我希望该用户能够访问他们自己的特定维护记录。据推测,这将使用用户使用 Firebase Auth 注册应用程序后生成的 UID 来完成。

维护活动

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

    }

登录活动

这是我目前实施的。目前,我可以使用 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 数据库

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

不确定此处是否需要我的 MaintenanceActivity 代码,如果需要,需要哪些部分。

对此的任何帮助将不胜感激,已经坚持了这么久。

非常感谢。

【问题讨论】:

  • 您共享的代码不是从 Firebase 数据库中读取的,因此很难说出您的规则和数据发生了什么。
  • @FrankvanPuffelen 你需要什么?我意识到用一行又一行的代码堵塞了这个问题。
  • 老实说,我不清楚您的问题。但是从扫描来看,您似乎在读取或写入数据库时​​遇到了问题。如果这确实是问题所在,请编辑您的问题以包含产生问题的最小读/写代码。要尽量减少代码,但仍要完整,请查看creating an minimal, complete, verifiable example

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


【解决方案1】:

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

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

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

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

最后,在读操作中通过用户id来获取用户id的维护记录。

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

请看user specific data is saved in and fetched from firestore database。您也可以对实时数据库执行相同操作。

【讨论】:

  • 谢谢。提供的链接也很有用,谢谢。但是,我不确定在我的 SignUp/Login/MaintenanceActivities 中的何处实现此功能。对此的任何帮助将不胜感激。
  • 在您尝试将维护数据添加到 firebase db 以添加部分和读取数据的部分时。
  • 我添加了来自MaintenanceActivity 的两个方法。当我试图把答案放进去时,代码中有错误。 SignUpLogin 活动中是否也不需要实现某些东西?
  • 道歉,如果看起来我在寻找答案,但是,我超级卡住了。非常需要帮助!
  • 使用 FirebaseAuth.getInstance().getCurrentUser() 获取用户 ID 并添加该数据库。
猜你喜欢
  • 2017-04-02
  • 2013-02-09
  • 2015-10-26
  • 2010-09-18
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2017-10-03
  • 2013-07-29
相关资源
最近更新 更多