14

アプリケーションに適切なセキュリティ ルールを設定するのに苦労しています。

私が書いているアプリケーションの概要は、ユーザーが電子メールとパスワードを使用して自分自身を登録できることです (私はこれに完全に機能する Firebase Simple Login を使用しています)。ログインすると、ユーザーは Todo を追加できます。

angularFire('https://<firebase>/firebaseio.com/todos', $scope, 'todos');

また、任意のユーザーに対して新しい todo を追加するには、todos モデルを更新するだけです。

$scope.todos.push({
   user: 'a@b.com',
   todo: 'What to do?'
});

未登録ユーザーが todo を追加することを制限するために使用しているこのセキュリティ ルール:

  {
    "rules": {
      ".read": true,
      "todos": {
        ".write": "auth != null",
        ".validate": "auth.email == newData.child('user').val()"
      }
    }
  }

ただし、認証されたユーザーでもデータを書き込むことはできず、「FIREBASE WARNING: on() or once() for /todos failed: Error: permission_denied.」というエラーがスローされます。

しかし、シミュレーターに次のデータを追加すると、期待どおりに機能します。

{user: "a@b.com", todo: 'What to do?'} 

ログは次のとおりです。

/todos:.write: "auth != null"
    => true
/todos:.validate: "auth.email == newData.child('user').val()"
    => true
/todos:.validate: "auth.email == newData.child('user').val()"
    => true

Write was allowed.
4

1 に答える 1

17

pushランダムに生成された ID (時系列順) を持つ新しい子を に追加し/todosます。つまり、newData指していると思われるものを指していません。ルールを次のように変更します。

{
  "rules": {
    ".read": true,
    "todos": {
      "$todoid": {
        ".write": "auth != null",
        ".validate": "auth.email == newData.child('user').val()"
      }
    }
  }
}

更新:上記のルールは有効ですが、angularFire は現在配列全体をサーバーに書き戻し、認証が失敗する原因となっています。次のように、代わりに angularFireCollection を使用して、新しい TODO のみを書き戻すことができます。

$scope.todos = angularFireCollection(new Firebase(URL));

$scope.todos.add({user: 'a@b.com', todo: 'What to do?'});

新しい項目がリストに追加されたときの angularFire の動作を最適化するための未解決の問題がありますが、当面は angularFireCollection を使用して正しい動作を得ることができます。

于 2013-09-09T18:09:06.223 に答える