2013-09-07 6 views
13

내 응용 프로그램에 적절한 보안 규칙을 설정하는 데 어려움을 겪고 있습니다.Firebase 보안 규칙이 권한을 거부합니까?

필자가 작성한 응용 프로그램에 대한 개요는 사용자가 전자 메일과 암호를 사용하여 스스로 등록 할 수 있다는 것입니다. (완벽하게 작동하는 Firebase Simple Login을 사용하고 있습니다). 로그인하면 사용자가 할일을 추가 할 수 있습니다.

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

모든 사용자에 대해 새로운 할 일 목록을 추가하려면 간단히 할 일 목록 모델을 업데이트하면됩니다.

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

내가 어떤 할 일 추가 등록되지 않은 사용자를 제한하는 데 사용하고이 보안 규칙 :

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

는하지만 그것도 인증 된 사용자가 어떤 데이터를 기록하는 것을 허용하지 않고 오류를 던지고, "FIREBASE WARNING :/todos에 대한 on() 또는 once() 실패 : 오류 : permission_denied."

하지만 시뮬레이터에서 다음 데이터를 추가하면 예상대로 작동합니다.

/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에서 보안 시뮬레이터를 사용하면이 기능이 작동하지 않는 이유를 확인할 수 있습니다. 두 가지 의견 : 1) 당신은 하나의 객체를 가진 배열을 작성하는 것 같고, 그것은 단지 하나의 객체 여야합니다. 2) "$ todos"변수는 단지 "todos"여야합니다. – Anant

+0

@Anant : 답장을위한 Thx. 앞에서 말했듯이 $를 제거하고 유효성 검사 규칙을''.validate ''로 변경했습니다 : "auth.email == '[email protected]'"''@b.com'은 등록 된 사용자입니다. ''validate '': "[email protected]"== newData.child ('user') .Val() "'. newData의 내용을 볼 수 있습니까? – codef0rmer

+0

@Anant : 더 명확하게하기 위해 질문을 업데이트했습니다. 앞에서 말했듯이 $가 필요하지 않은 이유는 문서의 어디에서나 사용되는 이유는 무엇입니까? – codef0rmer

답변

16

push가 (시간 순으로) 임의로 생성 된 ID를 가진 새로운 자식을 추가로 /todos : 여기

{user: "[email protected]", todo: 'What to do?'} 

로그이다. 그래서 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

관련 문제