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.
Bạn có vấn đề/câu hỏi cụ thể nào? –
Đây có phải là một tình huống rất phổ biến không? :) –
@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ó! –