로데르에서 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.
[anonymous auth] (https://www.firebase.com/docs/security/simple-login-anonymous.html)를 보았습니까? 이는 안전하지 않고 해킹 가능한 쓰기 규칙보다 나은 해결책 일 수 있습니다. – Kato
@Kato 익명의 인증을 설정하면 최상위 레벨에서 모든 인증 된 사용자가 사용자/경로에서 원하는만큼 많은 사용자를 생성 할 수있는 cappability에 있다는 것을 의미하는 문제가 있다고 생각합니다. 이미 있기 때문에 authenticated .... 나는 중첩 된 보안 규칙을 가질 수 없다는 사실에 큰 문제가있다. –
보안 규칙 캐스케이드. 루트에서 쓰기를 허용하면 사용자는 루트 아래의 모든 레벨에서 쓸 수 있습니다. 노드를 자신의 경로로 제한하려면 루트에서 규칙을 제거하십시오. – Kato