2016-10-04 5 views
7

У меня есть два пользователя, созданные на моей консоли Firebase, у обоих есть другое имя пользователя и адрес электронной почты.Swift + Firebase Безопасность не работает

Я хочу, чтобы они могли хранить свою оценку онлайн в базе данных. Это структура:

AppName 
    - GameStats 
    - DBW9WQEs2sQn9CuPTE9t7Q1qWSz2 
     - Score : 0986 
    - Li75C2BYW7bQnKqMmrqLAZ67HUy4 
     - Score : 44131 

Чтобы получить это значение, и держать его синхронизируется я использую это:

let baseRef = FIRDatabase.database().reference(withPath: "GameStats/" + user.uid + "") 
let scoreRef = scoreRef.child("Score") 

scoreRef.observe(.value, with: { snapshot in 
    print(snapshot.value) 
}) 

Я хотел проверить, может ли два пользователя получить доступ к другой информации от другого пользователя. Я изменил линию, чтобы включить другие user.uid вот так:

let baseRef = FIRDatabase.database().reference(withPath: "GameStats/Li75C2BYW7bQnKqMmrqLAZ67HUy4") 

// Logged in User: DBW9WQEs2sQn9CuPTE9t7Q1qWSz2 

и по какой-то причине он выдает это:

Optional(44131) 

Если изменить значение в базе данных, она автоматически обновляет значение в один я положил.

Это неправильный пользователь и по какой-либо причине имеет к нему доступ.

Это мои правила:

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null", 
     "GameStats": { 
     "$user_id": { 
     ".write": "auth != null && auth.uid === $user_id && auth.provider === 'password'", 
     ".read": "auth != null && auth.uid === $user_id && auth.provider === 'password'" 
     } 
    } 
    } 
} 

Почему приложение позволяет одному пользователю читать чужие пользователи данных и как ограничить доступ, так что пользователь может получить доступ к данным только по их идентификатору пользователя?

Как предложил @M_G, я достал .write от родителя и .read. Так что мои правила теперь:

{ 
    "rules": { 
    // ".read": "auth != null", 
    // ".write": "auth != null", 
     "GameStats": { 
     "$user_id": { 
     ".write": "auth != null && auth.uid === $user_id && auth.provider === 'password'", 
     ".read": "auth != null && auth.uid === $user_id && auth.provider === 'password'" 
     } 
    } 
    } 
} 

я теперь получить этот вывод:

[FirebaseDatabase] setValue: or removeValue: at /GameStats/DBW9WQEs2sQn9CuPTE9t7Q1qWSz2 failed: permission_denied - This is for the correct user too. I get this error if wrong user also. 
+0

Вы пытались удалить общее правило '.write'? –

+0

@M_G Вы имеете в виду: «.write»: «auth! = Null»? Хотя эти правила относятся только к родителям. поэтому спецификация дочерних правил – JamesG

+0

Я бы попробовал, так как правило написания GameStats кажется правильным. –

ответ

3

Firebase документ неправильно (на данный момент). В консоли Firebase откройте симулятор правил. В настоящее время нет опции «пароль», я думаю, что это ошибка.

Если вы не используете множественную аутентификацию или многократную аутентификацию не имеет значения в вашем проекте, не используйте поставщика по вашим правилам. В противном случае вы можете проверить это правило для аутентификации пароля:

".write": "auth != null && auth.uid === $user_id && auth.token.firebase.identities.email !== null" 
Смежные вопросы