2013-09-07 19 views
13

私は自分のアプリケーションに適切なセキュリティルールを設定しようとしています。Firebaseセキュリティルールは許可を拒否しましたか?

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

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

任意のユーザーに対して新しいTodoを追加するには、単にtodosモデルを更新します。

$scope.todos.push({ 
    user: '[email protected]', 
    todo: 'What to do?' 
}); 

私は任意のTODOを追加するために未登録ユーザーを制限するために使用しています。このセキュリティルール:

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

しかし、それは、任意のデータを書き込むようにしても認証されたユーザーを許可し、エラーを投げていません、 "FIREBASE WARNING:/ todosのon()またはonce()に失敗しました:エラー:permission_denied。"

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

{user: "[email protected]", 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. 
+0

Forgeでセキュリティシミュレータを使用して、これが動作しない理由を確認できます。 2つのコメント:1)あなたは1つのオブジェクトを持つ配列を書いているようですが、おそらく1つのオブジェクトにすぎません。 2) "$ todos"変数はたぶん "todos"でなければなりません。 – Anant

+0

@Anant:返信用のThx。あなたが言ったように、私は$を削除し、バリデーションルールを '' .validate ''で変更しました: "auth.email == '[email protected]'" '' a @ b.com'は登録ユーザーです。 ''validate '': '' [email protected] '== newData.child(' user ')。val()" '。 newDataの内容を確認することはできますか? – codef0rmer

+0

@Anant:質問をもっと明確にするために質問を更新しました。あなたが言ったように、なぜドキュメントがどこに使われているのかは分かりません。 – codef0rmer

答えて

16

push/todosに(時系列順)ランダムに生成されたIDを持つ新しい子が追加されます。だから、newDataはあなたが指していると思っているものを指していません。

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

アップデート:に自分のルールを変更するルールの上は有効ですが、angularFireは現在、認証が失敗する原因のサーバーに戻って配列全体を書き込みます。

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

$scope.todos.add({user: '[email protected]', todo: 'What to do?'}); 

新しい項目がリストに追加されangularFireの動作を最適化するために、未解決の問題があるのですが、その間に、あなたはにangularFireCollectionを使用することができます:あなただけそうのように、バック新しいTODOを書き込むために、代わりにangularFireCollectionを使用することができます正しい行動を取る。

+0

私はすでにそれを試みましたが運はありません。 – codef0rmer

+1

問題はangularFireにあり、firebase-talkメーリングリストに回避策を投稿しました(代わりにangularFireCollection.addを使用)。 – Anant

関連する問題