2017-03-14 39 views
10

Tiếp theo thông tin về các vấn đề tương tự như trên Stack Tôi đã kết thúc với những điều sau đây:căn cứ hỏa lực - Buộc tên người dùng độc đáo

Cơ sở dữ liệu:

{ 
    "user" : { 
    "xbStJyCtfzf472" : { 
     "avatar" : "avatar", 
     "email" : "[email protected]", 
     "fbId" : 10154200898, 
     "lastLogin" : "Tue Mar 14 22:31:36 GMT+01:00 2017", 
     "registerDate" : "Tue Mar 14 22:31:36 GMT+01:00 2017", 
     "uid" : "xbStJyCwY5Ttfzf472", 
     "username" : "myName" 
    } 
    }, 
    "usernames" : { 
    "myName" : "xbStJyCtfzf472" 
    } 
} 

Rules:

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null", 

    "users": { 
    "$uid": { 
     ".write": "auth !== null && auth.uid === $uid", 
     ".read": "auth !== null && auth.provider === 'password'", 
     "username": { 
     ".validate": " 
      !root.child('usernames').child(newData.val()).exists() || 
      root.child('usernames').child(newData.val()).val() == $uid" 
      } 
     } 
     } 
    } 
} 

Android Java Code:

public void addUserToDatabase(final long fbId){ 
     final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
     if (user != null) { 
      final String username = "myName"; 

      //add the user 
      mDatabase.child("usernames").child(username).runTransaction(new Transaction.Handler() { 
       @Override 
       public Transaction.Result doTransaction(MutableData mutableData) { 
        if (mutableData.getValue() == null) { 
         mutableData.setValue(user.getUid()); 
         return Transaction.success(mutableData); 
        } 

        return Transaction.abort(); 
       } 

       @Override 
       public void onComplete(DatabaseError firebaseError, boolean commited, DataSnapshot dataSnapshot) { 
        if (commited) { 
         String email = user.getEmail(); 
         String uid = user.getUid(); 
         String avatar = "avatar1"; 
         long mFbId = fbId; 
         String registered = Calendar.getInstance().getTime().toString(); 
         String lastLogin = Calendar.getInstance().getTime().toString(); 

         Log.w("AUTH", "username saved"); 
         mDatabase.child("user").child(uid).setValue(new User(username, email, uid, avatar, mFbId, lastLogin, registered)); 
        } else { 
         Log.w("AUTH", "username exists"); 
        } 
       } 
      }); 
     } 
    } 

Điều này làm việc, vì nếu tôi cố gắng đăng ký tài khoản với cùng một userName, không có gì được tạo trong cơ sở dữ liệu của tôi. Tuy nhiên, Một người dùng được tạo trong Xác thực/Người dùng của tôi. Tôi có thể thấy điều này dẫn đến tất cả các loại vấn đề.

Tôi nên ép buộc tên người dùng duy nhất trong cơ sở dữ liệu của mình theo cách không đăng ký người dùng cho đến khi séc được thực hiện?

EDIT: Để làm rõ, tôi có thể phát hiện tên người dùng được thực hiện và nhắc người dùng nhập tên người dùng khác. Tuy nhiên, nếu người dùng nhận cuộc gọi/thoát khỏi ứng dụng của tôi khi thực hiện việc này, email của họ sẽ được xác thực (nghĩa là họ không thể đăng ký lại), nhưng họ sẽ không có đối tượng Người dùng trong cơ sở dữ liệu của tôi, không bao giờ có thể sử dụng ứng dụng của tôi.

+1

Bạn có vấn đề/câu hỏi cụ thể nào? –

+0

Đây có phải là một tình huống rất phổ biến không? :) –

+1

@FrankvanPuffelen Bất kỳ ý tưởng nào? Nếu không có chức năng rất cơ bản này, tôi chỉ đơn giản là không thể sử dụng Firebase, mà hút vì tôi thực sự thích nó! –

Trả lời

6

ngắn Trả lời:

Đầu tiên người dùng đăng ký, sau đó nhắc nhở chúng để đưa vào tên tài khoản, khi họ làm, tạo tài khoản đối tượng của họ trong cơ sở dữ liệu của bạn.

Giải pháp cho vấn đề:

Nếu người dùng đối với một số lý do thoát ứng dụng khi quyết định vào tên người dùng, dẫn email của họ để được lưu trữ trong thẩm định-bàn mà không có một -object User trong cơ sở dữ liệu, chúng tôi có một vấn đề. Để giải quyết vấn đề này, bất cứ khi nào người dùng đăng nhập, chúng tôi có thể kiểm tra xem UID của họ có tồn tại trong số User-có thể thực hiện hay không, tuyệt vời! Nếu không, sau đó chúng tôi nhắc họ nhập lại tên người dùng và sau đó tạo đối tượng Người dùng.

+1

Tại sao chúng ta không thể thực hiện điều này một cách hiệu quả trước khi người dùng được đăng ký? – waseefakhtar

Các vấn đề liên quan