我是firebase的新手。在我的Android应用中,我希望每个用户只能访问他创建的数据。我正在阅读https://www.firebase.com/docs/security/guide/securing-data.html,但没有多大意义。假设我已经使用电子邮件和密码登录,
谢谢!
Firebase规则
{
"rules": {
".read": true,
".write": true
}
}
Java代码
myFirebaseRef.child("message").setValue("This is the message");
答案 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");
最后,我的数据看起来像这样:
答案 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");
}
}
};
这就是全部。
您现在可以添加自己的实现来检索邮件列表。但是,这不会是一个问题。