1

로데르에서 backbone.js를 사용하여 앱을 작성하는 중입니다. 당신은 내가 실제로 여기에 무엇을 찾을 수 있습니다 : https://the-todo-app.firebaseapp.com/클라이언트가 사용자를 만들지 만 인증 될 때까지 수정하지 못하게하십시오.

내 생각은 사람들을 페이스 북과 함께 simpleLogin을 사용하여 응용 프로그램에 등록하여 사용자를 만들 수 있도록 허용 한 다음 사용자에게 리디렉션되고 사용자가 자신의 할일을 만들고 수정할 수 있도록 허용하는 것입니다. 내가 가진 문제는 실제로 모든 사용자가 사용자 폴더에 쓸 수있는 가능성이 있다는 것입니다. 즉, 다른 사용자의 데이터를 입력 및 삭제하거나 수정할 수 있습니다. firebase에서 보안을 제한하여 사용자가 자신의 ID를 기반으로 사용자를 만들 수 있도록하고 싶지만 인증되지 않은 경우 쓰기를 허용하지 않습니다. 이것은 내가 실제로 무엇을 가지고 :

{ 
    "rules": { 
    ".read": true, 
    ".write": true, 
    ".validate": "data.hasChildren(['name', 'picture'])", 
    "users": { 
     "$user": { 
     ".read": "$user == auth.id", 
     ".write": "$user == auth.id" 
     }   
    } 
    } 
} 

아소이 시도 :

{ 
    "rules": { 
    ".read": true, 
    "users": { 
     "$user": { 
     ".read": "$user == auth.id", 
     ".write": "$user == auth.id" 
     }   
    } 
    } 
} 

을하지만,이 방법은 클라이언트가 사용자 ID를 만들 수 나던.

이 내 데이터가 실제로 모습입니다 : 너희들은이 작업을 수행하는 방법에 대한 아이디어가 있다면

{ 
    "users" : { 
    "10152111176005069" : { 
     "name" : "Jhonnatan Gonzalez Rodriguez", 
     "picture" : "url to pic" 
    }, 
    "10154397958535078" : { 
     "name" : "Diana Rincón P", 
     "picture" : "url to pic" 
    }, 
    "10152167159946759" : { 
     "name" : "Sebastian Ayala", 
     "picture" : "url to pic" 
    } 
    }, 
    "title" : "The todo app" 
} 

내가 주셔서 감사합니다.

ArneHugo의 답을 바탕으로이 규칙을 설정하고 꽤 잘 작동하는 것처럼 보입니다. 확실히하기 위해 더 많은 테스트를 수행해야합니다.

{ 
    "rules": { 
    "users": { 
     ".write": "!data.child(auth.id).exists()", 
     "$user": { 
     ".read": "$user == auth.id", 
     ".write": "$user == auth.id", 
     ".validate": "newData.hasChildren(['name', 'picture'])" 
     }   
    } 
    } 
} 

가 실제로 데이터가 존재하는지 확인하도록 허용하기 위해 true로 사용자에게 .read 규칙을 추가했다,이 규칙 지금 모습입니다.

{ 
    "rules": { 
    "users": { 
     ".read": "true", 
     ".write": "!data.child(auth.id).exists()", 
     "$user": { 
     ".read": "$user == auth.id", 
     ".write": "$user == auth.id", 
     ".validate": "newData.hasChildren(['name', 'picture'])" 
     }   
    } 
    } 
} 

는 그리고 이것은 출력 익명 사용자

Attempt to write {"id":"6726363"} to /users/6726363 with auth=null 
    /
    /users:.write: "!data.child(auth.id).exists()" 
5:30: child() expects a string argument. 
     => false 
    /users/6726363:.write: "$user == auth.id" 
     => false 
    /users/6726363:.validate: "newData.hasChildren(['name', 'picture'])" 
     => false 

Validation failed. 
Write was denied. 

을 찾고이 인증 된 사용자에 대해 어떻게 보이는지 방법이다.

Attempt to write {"name":"6726363","picture":"fb picture"} to /users/6726363 with auth={"id":"6726363"} 
    /
    /users:.write: "!data.child(auth.id).exists()" 
     => true 
    /users/6726363:.validate: "newData.hasChildren(['name', 'picture'])" 
     => true 
    /users/6726363:.validate: "newData.hasChildren(['name', 'picture'])" 
     => true 

Write was allowed. 

그리고 다른 사용자 데이터를 쓰려는 익명 사용자의 경우에는 uoutput입니다.

Attempt to write {"name":"6726363","picture":"fb picture"} to /users/10152111176005069 with auth=null 
    /
    /users:.write: "!data.child(auth.id).exists()" 
5:30: child() expects a string argument. 
     => false 
    /users/10152111176005069:.write: "$user == auth.id" 
     => false 
    /users/10152111176005069:.validate: "newData.hasChildren(['name', 'picture'])" 
     => true 

No .write rule allowed the operation. 
Write was denied. 

이제 제작이 예는 데이터베이스에 존재하는 ID로 인증 된 사용자가이만큼의 사용자 데이터를 writte 수 있다는 것을 발견했다.

Attempt to write {"name":"6726363","picture":"fb picture"} to /users/10152111176005069 with auth={"id":"6726363"} 
    /
    /users:.write: "!data.child(auth.id).exists()" 
     => true 
    /users/10152111176005069:.validate: "newData.hasChildren(['name', 'picture'])" 
     => true 
    /users/10152111176005069:.validate: "newData.hasChildren(['name', 'picture'])" 
     => true 

Write was allowed. 
+1

[anonymous auth] (https://www.firebase.com/docs/security/simple-login-anonymous.html)를 보았습니까? 이는 안전하지 않고 해킹 가능한 쓰기 규칙보다 나은 해결책 일 수 있습니다. – Kato

+0

@Kato 익명의 인증을 설정하면 최상위 레벨에서 모든 인증 된 사용자가 사용자/경로에서 원하는만큼 많은 사용자를 생성 할 수있는 cappability에 있다는 것을 의미하는 문제가 있다고 생각합니다. 이미 있기 때문에 authenticated .... 나는 중첩 된 보안 규칙을 가질 수 없다는 사실에 큰 문제가있다. –

+1

보안 규칙 캐스케이드. 루트에서 쓰기를 허용하면 사용자는 루트 아래의 모든 레벨에서 쓸 수 있습니다. 노드를 자신의 경로로 제한하려면 루트에서 규칙을 제거하십시오. – Kato

답변

3

당신이하고 싶은 일은 전적으로 가능하며 카토와 다른 종류의 로그인을 사용해야한다는 것에 동의하지 않습니다. 이 모든입니다

이 필요합니다

"rules": { 
    "users": { 
     //".write": "!data.exists()", /* Edit: removed, as it always returned false */ 
     "$user": { 
     ".read": "$user == auth.id", 
     ".write": "$user == auth.id", 
     ".validate": "newData.hasChildren(['name', 'picture'])" 
     }   
    } 
    } 
  1. 새로운 사용자가 자신에 대한 $ 사용자 항목을 추가 할 수 있습니다.
  2. 사용자가 자신의 사용자가 아닌 $ 사용자에게서 읽을 수있는 사용자가 없습니다.
  3. 사용자는 자신이 아닌 다른 $ 사용자에게 글을 쓸 수 없습니다 (올바른 항목을 만들 때 처음 만들 때 포함).
  4. $ 사용자 항목은 이름과 사진이 있어야합니다. (유효성 검사 규칙을 옮겼습니다.)

Protip : 보안 규칙을 테스트하려면 Firebase의 시뮬레이터를 사용하십시오. 그것은 위대하고 간단한 도구입니다.

편집

난 당신이 정말 데이터가 존재하는지 확인하기 위해 읽기 규칙을 필요로 할 수 있는지 확인하기 위해 테스트를했다. (답 :. 그렇게하지) 다음과 같은 보안 규칙을

"test": { 
    ".write": "!data.child(auth.id).exists()", 
    "$user": { 
     ".validate": "newData.hasChildren(['name', 'picture']) && $user == auth.id", 
     ".read": "$user == auth.id", 
     ".write": "$user == auth.id" 
    }   
} 

새 사용자 작성하는 시도 : 나는 데이터가 단지 존재하는지 여부를 확인할 수 있습니다 내 테스트에서

Attempt to write {"name":"Beardinator","picture":"i.imgur.com/axXz9sr.jpg"} to /test/1337 with auth={"id":"1337"} 
    /:.write: "root.child('adminPanel').child('admins').child(auth.uid).val() != null" 
20:67: child() expects a string argument. 
     => false 
    /test:.write: "!data.child(auth.id).exists()" 
     => true 
    /test/1337:.validate: "newData.hasChildren(['name', 'picture']) && $user == auth.id" 
     => true 
    /test/1337:.validate: "newData.hasChildren(['name', 'picture']) && $user == auth.id" 
     => true 

Write was allowed. 

을 "사용자"에 대한 .read 규칙이 없어도 괜찮습니다.

+0

안녕하세요, 시뮬레이터에서 실제로 테스트했지만 ".write": "! data.exists()"규칙은 사용자가 인증 된 경우에도 새 사용자를 만들 수 없습니다. –

+0

질문을 편집하여 실제로 귀하의 답변에 근거한 규칙을 정한 것이 그렇게 잘 작동하는 것 같습니다. –

+0

"! data.exists()"는 매번 false를 반환하므로 제거했습니다. 그러나 글쓰기는 여전히 나를 위해 작동합니다. 새 사용자를 쓰려고 할 때 시뮬레이터에서 얻은 결과를 표시 할 수 있습니까? – ArneHugo

관련 문제