Как использовать Firebase аутентификацию для разных типов пользователей для доступа к их соответствующим узлам базы данных в реальном времени или дочерним узлам - PullRequest
0 голосов
/ 09 апреля 2019

Я создаю приложение электронной коммерции для Android с Firebase, как я могу изолировать разных пользователей, таких как Покупатель и Продавец, в Аутентификации Firebase и дать доступ для чтения и записи в соответствующие узлы базы данных в базе данных Firebase (База данных в реальном времени)

1 Ответ

1 голос
/ 09 апреля 2019

Этого можно добиться, используя структуру базы данных, подобную этой:

{
    "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, а не только фильтрацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...