2

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

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

谢谢!

火力地堡规则

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

的Java代码

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

请添加最小信息以将问题重现到您的问题。它下面有一个编辑链接,允许您添加:JSON结构的片段(如文本,没有截图),失败的代码和安全规则。 –

+0

@FrankvanPuffelen修复 –

回答

7

感谢Joey Roosing,我弄清楚了剩下的部分。我需要根据用户的uid对数据进行分组。

首先,修改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

很高兴你有它的工作:)享受firebase-ing! –

+0

我怎样才能访问阅读我的个人资料,如姓名年龄给特定用户说我的经理。 –

+0

Errm,未找到类“Firebase” –

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)。

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

林不知道有关的追随者,但是这是我如何相信它的工作原理:

火力地堡自动生成较上(第一),全成登录用户的唯一标识,并做到这一点只有一次。然后它使用该数据对新请求进行身份验证,如果找到匹配项,则规则$ iud === auth.uid为true,并且用户可以在我的示例的情况下读取和写入。

+0

感谢您的快速回复。我登录后仍然无法写入我的数据库。这是我的行:\t \t myFirebaseRef.child(“message”)。setValue(“This is the message”); –

+1

@Xi Wei疯狂的猜测,但是当firebase存储一个用户时,这些级别变成了Database> user> data。你可以试试.child(“用户”)并在这个级别下添加数据吗?我没有使用Java API,但我也有兴趣让它工作。 –

0

您需要POJO/Custom类来有效地写入/读取到Firebase数据库。 Idealy,你已经创建了一个类Message用getter和setter方法,并定义了默认构造函数:

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

就是这样。

您现在可以添加自己的实现来检索消息列表。很好,这不会是一个问题。