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

就是這樣。

您現在可以添加自己的實現來檢索消息列表。很好,這不會是一個問題。