2

ユーザー (Firebase anonymous で認証済み) が氏名、会社名、電子メール アドレスを送信して配布リストに登録できるようにする AngularjS アプリを構築しています。

私が達成したいのは、データを2回入力するユーザーフォームを無効にして、送信されたデータがデータベースに既に存在するかどうかを確認することです。その場合、送信されたデータを拒否し、DB をクリーンに保つ必要があります。UI がすべてのエラー メッセージなどを処理します。

私のエンドポイント: http://someurl.firebaseio.com/accounts/

push() 経由で /accounts/ に送信されたサンプルデータ:

{fullName: "John Doe", company: "Pet's Place", email: "john@petsplace.org"}

Firebase セキュリティ ルールの設定:

目標: 誰もが /accounts/ に書き込み、一意の値のみを登録し、長さと isString の検証を行うことができます。匿名ユーザーの読み取りは許可されていません。

{
"rules": {
    ".read": "auth !== null",
    ".write": "auth !== null",
    "accounts": {
        ".write": "auth !== null && newData.exists()",
        "$accountID": {
            ".read": false,
            ".validate": "newData.hasChildren(['fullName', 'company', 'email'])",
            "fullName": {
                ".validate": "newData.isString() && newData.val().length > 0 && newData.val().length < 50 && !newData.val().contains('admin')"
            },
            "company": {
                ".validate": "newData.isString() && newData.val().length > 0 && newData.val().length < 50"
            },
            "email": {
                ".validate": "newData.isString() && newData.val().length > 0 && newData.val().length < 50"
            }
        }
    }
}
}

(複数)送信後の結果

{
"accounts" : {
"-JY249g70KL-XG0c6ekM" : {
  "company" : "Pet's Place",
  "email" : "john@petsplace.org",
  "fullName" : "John Doe"
},
"-JY249y2IwFWAYwEqC4Q" : {
  "company" : "Pet's Place",
  "email" : "john@petsplace.org",
  "fullName" : "John Doe"
},
"-JY24ACApcPH2_jiU5PD" : {
  "company" : "Pet's Place",
  "email" : "john@petsplace.org",
  "fullName" : "John Doe"
},
"-JY24AL8QOKQRiTh3Oqm" : {
  "company" : "Pet's Place",
  "email" : "john@petsplace.org",
  "fullName" : "John Doe"
}
}
}
4

1 に答える 1

1

電子メール アドレスをキーとして使用することで、各電子メール アドレスに対してエントリが 1 つだけになるようにすることができます。

var fbRef = new Firebase('https://someurl.firebaseio.com/');

// create a new user somehow
var newUser = {
    fullName: "John Doe", 
    company: "Pet's Place", 
    email: "john@petsplace.org"
}

// escape '.' because it can not be used as a key in FB
function escapeEmail(email){
    return email.replace(/\./g, ',');
}

fbRef.child('accounts').child(escapeEmail(newUser.email)).set(newUser, function(err) {
    if(err) {
        // if there was an error, the email address already exists
    }
);

次に、ルールで、キー (電子メール アドレス) がまだ存在しないことを検証します。

{
    "rules": {
        ".read": true,
        "accounts": {
            "$account": {
                ".write": true,
                ".validate": "!root.child('accounts').child(newData.child('email').val().replace(/\./g, ',')).exists()"
            }
        }
    }
}

追加情報については、こちらもご覧ください: 他のフィールドに基づくコレクションでの重複を防ぐ Firebase ルールは何ですか? そしてここ: Firebaseでユーザープロパティの重複を防ぐにはどうすればよいですか?

于 2014-10-09T00:21:18.640 に答える