Этого можно добиться, используя структуру базы данных, подобную этой:
{
"users": {
"someUserId-782nafdca9": {
"name": "Joe Smith",
"type": "customer",
...
},
"someUserId-78sdfgs523": {
"name": "Example Supplier Co.",
"type": "seller",
...
}
},
"dataForSellers": {
...
},
"dataForCustomers": {
...
}
}
со следующими правилами:
"rules": {
"users": {
"$uid": {
".read": "auth.uid == $uid",
".write": "auth.uid == $uid",
}
},
"dataForCustomers": {
".read": "auth != null && root.child('users').child(auth.uid).child('type').val() == 'customer'",
".write": "auth != null && root.child('users').child(auth.uid).child('type').val() == 'customer'"
},
"dataForSellers": {
".read": "auth != null && root.child('users').child(auth.uid).child('type').val() == 'seller'",
".write": "auth != null && root.child('users').child(auth.uid).child('type').val() == 'seller'"
}
}
Правила безопасности имеют ряд предопределенных переменных , который можно использовать для проверки различных условий.Приведенные выше правила используют переменные auth
и root
.
Правила для пользовательских данных в users/$userId
, в настоящее время проверяют только, соответствует ли текущий пользователь пользовательским данным, которые они пытаются изменить(auth.uid == $uid
).
Правила для dataForCustomers
и dataForSellers
сначала проверяют, вошел ли пользователь в систему (auth != null
), а затем проверяют, содержат ли его пользовательские данные (к которым обращается root.child('users').child(auth.uid)
)правильное значение для type
.
Примечание 1 : Поскольку @ Doug , упомянутый в их комментарии, документацию по правилам безопасности можно найти здесь с дополнительными подробностями о защите пользовательских данных .
Примечание 2 : Как и в официальной документации, этот пример не лишен недостатков.Например, в любое время с правилами безопасности, как указано выше, если пользователь вошел в систему, он может:
- изменить себя между покупателем и продавцом, если они вошли в вашу базу данных.
- добавить мусор в вашу базу данных
- удалить любые данные, сделанные другими пользователями (без понятия «автор»)
Примечание 3 : непросто вложите все свои данные в «dataForSellers» и «dataForCustomers», они были заданы в качестве имен заполнителей для ваших собственных деревьев данных, таких как «продукты», «доставка», «заказы» и т. д.
Примечание 4 : Поскольку вы только начинаете работать с RTDB, обязательно ознакомьтесь со статьей RTDB vs. Firestore .Для электронной коммерции лучше использовать Firestore, а не только фильтрацию.