如何确保用户只能在firebase中查看和访问自己的数据?

时间:2016-03-05 22:45:26

标签: android firebase firebase-security firebase-authentication

我是firebase的新手。在我的Android应用中,我希望每个用户只能访问他创建的数据。我正在阅读https://www.firebase.com/docs/security/guide/securing-data.html,但没有多大意义。假设我已经使用电子邮件和密码登录,

  1. 我该如何编写Firebase规则?
  2. 如何在我的Android Java代码中写入我的Firebase数据?
  3. 谢谢!

    Firebase规则

    {
        "rules": {
            ".read": true,
            ".write": true
        }
    }
    

    Java代码

    myFirebaseRef.child("message").setValue("This is the message");
    

3 个答案:

答案 0 :(得分:7)

感谢Joey Roosing,我能够弄明白其余部分。我需要根据用户的uid对数据进行分组。

首先,修改Joey提到的Firstbase规则:

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

然后,在我的Java代码中:

Firebase rootRef = new Firebase("https://user-account.firebaseio.com/");
// Assuming the user is already logged in.
Firebase userRef = rootRef.child("users/" + rootRef.getAuth().getUid());
userRef.child("message1").setValue("Hello World");

最后,我的数据看起来像这样:

Firebase Data

答案 1 :(得分:4)

如果您使用oauth,这是最基本的示例:

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

https://www.firebase.com/docs/security/guide/user-security.html此链接应该有所帮助。

auth.uid我相信用户当前正在连接,$ uid是用户在系统中的知名方式(在这种情况下是firebase)。

我的示例使用谷歌登录,但它应该适用于所有其他类型。

我不确定以下内容,但这是我相信它的工作方式:

Firebase会自动生成一个唯一的ID,表示用户在(第一次)成功登录后,只执行一次。然后它使用该数据对新请求进行身份验证,如果找到匹配,则规则$ iud === auth.uid为true,并且用户可以在我的示例的情况下进行读写。

答案 2 :(得分:0)

您需要POJO / Custom类才能有效地写入/读取Firebase数据库。 理想情况下,您创建了一个带有setter和getter的类Message,并定义了一个默认构造函数:

class Message {
  private String message;

  public Message() {
  }
  public Message(String message) {
    this.message = message;
  }

  public void getMessage() {
    return message;
  }
  public void setMessage(String message) {
    this.message = message;
  }
}

然后将规则更改为:

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

然后在你的java代码中执行以下操作:

DatabaseReference mDatabaseReference;
FirebaseUser firebaseUser;

 mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            firebaseUser = firebaseAuth.getCurrentUser();
            if (firebaseUser != null) {
                // User is signed in
            } else {
                // User is signed out
            }
        }
    };
...


//To save a message associated to only the signed in user
Message message = new Message();
message.setMessage("a message");
mDatabaseReference = FirebaseDatabase.getInstance().getReference(); 
mDatabaseReference.child("message").child(firebaseUser.getUid())
     .setValue(message)
     .addOnCompleteListener(DetailsCaptureActivity.this, new OnCompleteListener<Void>() {
     ...
  });

现在,要阅读此数据,请执行以下操作:

//Set up an AuthStateListener that responds to changes in the user's sign-in state:
    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            firebaseUser = firebaseAuth.getCurrentUser();
            if (firebaseUser != null) {

                   databaseReference = firebaseDatabase.getReference().child("message").child(firebaseUser.getUid());
                   databaseReference.addValueEventListener(new ValueEventListener() {
                      @Override
                      public void onDataChange(DataSnapshot dataSnapshot) {
                          Message message = dataSnapshot.getValue(Message.class);
                          //You can now get your message using message.getMessage();
                      }

                      @Override
                      public void onCancelled(DatabaseError databaseError) {

                          Log.e(TAG, databaseError.getMessage());
                      }
                  });

            } else {
                Log.e(TAG, "onAuthStateChanged:signed_out");
            }
        }
    };

这就是全部。

您现在可以添加自己的实现来检索邮件列表。但是,这不会是一个问题。