2016-12-12 18 views
0

私はすでに存在するユーザ名の作成を防ぎます。Firebaseデータベース、Swiftで重複するユーザを防ぐ3

これは私がデータベースにユーザ名をアップロードする私のコードです:

ref?.child("users").child(FIRAuth.auth()!.currentUser!.uid).child("username").setValue(self.createUserName.text) 

そして、これは私がユーザ名がすでに存在する場合は取得しようとするコードやない

ref?.child("users") 
    .queryOrdered(byChild: "username") 
    .queryEqual(toValue: self.createUserName.text?.uppercased()) 
    .observeSingleEvent(of: .value, with: { (snapshot) in 

     if !snapshot.exists() { 

      print("") 

     } 

    }) { error in 

     print("") 

    } 

データベースルックスですこのように

Database_App { 

    users { 

     -3bSRmS4PHXUwsr7XbMBwgPozNfK2 { 

      username: "sebas.varela" 

     } 

    }  

} 

この行はコンソールに表示されます:

Consider adding ".indexOn": "username" at /users to your security rules for better performance 

問題は私がいつもを得ることです。これの問題は何ですか?

+0

あなたはFirebaseデータベースルールを利用することを検討しているあなたは、サーバーから取得しますエラーデータの重複を防ぐには? @Katoによってこの回答[http://stackoverflow.com/a/20291163/4625829]を参照してください。 –

+0

firebaseデータベースの設定方法で一意のユーザー名を確認するには、 'ref.child(" users ")'のノード全体で、 - > 'let value = sanpshot.value as! [String:[String:String]] 'を実行し、辞書キーを繰り返して、ネストされた辞書のキー' username'の値がユーザーが要求したユーザー名と等しいかどうかを確認します。これは非効率です、@FrankvanPuffelenのアドバイスに従います – MikeG

+0

あなたはいくつかの方法でこれを達成できます。 1)Firebaseがユーザ名を作成しようとすることで重労働を起こした場合、Firebaseはエラーを生成します。 [User name Uniqueness](http://stackoverflow.com/questions/40619433/firebase-username-uniqueness-in-swift/40640229#40640229)を参照してください。2)ユーザ名が/ usersノードにあるユーザ情報を子供として保持します。それが存在するかどうかを調べるためにそれを照会します。素早くないが基本をカバーする[make username unique](http://stackoverflow.com/questions/35243492/firebase-android-make-username-unique)を参照してください。 – Jay

答えて

2

照会する参照の直下にある値のみを照会することができます。以下のようなデータモデルとなり、あなたのケースのために:

Database_App { 
    users { 
     -3bSRmS4PHXUwsr7XbMBwgPozNfK2: "sebas.varela" 
    }  
} 

これはあなたのコードで動作しますが、安全でパフォーマンスの高い入手困難であるだろう。より一般的なアプローチは、あなたがのUIDへのユーザー名をマップ余分なノードで動作するようです。この場合は

Database_App { 
    userNames { 
     "sebas,varela": "-3bSRmS4PHXUwsr7XbMBwgPozNfK2" 
    }  
} 

ノードは、基本的にユーザーが自分の名前を請求することができます。このシステムの利点は、キーが自動的にサーバー上で一意であることが保証され、その部分に必要なクライアント側のコードがないことです。あなたがしたいだろう

  • がユーザーを確実にセキュリティルールを追加するだけで、これらのセキュリティルールではまだ
  • も主張されていないユーザー名を主張することができるユーザーが自分の主張を解放することができますユーザ名
  • がデフォルトよりもよりよい方法で競合を処理するために、クライアント側のコードを追加し、「許可が拒否された」
+0

しかし、私はFirebaseを初めて使いました。あなたが言及したルールを追加する方法はわかりません。 –

+0

私が持っているもう一つの問題は、ノード名にドットまたはコンマのような記号を置くことができないので、ノードをユーザー名として呼び出し、user_idの値を配置しようとするとエラーが発生するということです。 –

+0

上記の理由から、上記のデータでピリオドの代わりにコンマを使用していることにお気づきかもしれません。鍵として受け入れられるように値を符号化することは、このタイプの検証の通常の部分です。 –

関連する問題