как реализовать контроль доступа на основе роли в firebase

Это мой первый набег на Firebase & nosql, я исхожу из фона SQL.

Использование простой учетной записи электронной почты для входа в систему, как ограничить доступ к данным в Firebase? Например, у некоторого пользователя будет доступ к созданию бизнес-объекта (пользователей, клиентов, категорий и т.д.), Другие - нет. Есть ли способ привязать список разрешений к переменной "auth"?

Ответ 1

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

{
  "rules": {
    ".read": true,
    "users": {
      ".write": "root.child('users').child(auth.uid).child('role').val() == 'admin'"
    }
  }
}

Где role - атрибут, принадлежащий ко всем объектам в вашей коллекции users.

Ответ 3

Firebase запустила поддержку доступа на основе ролей для любого пользователя через пользовательские заявки на токен идентификатора: https://firebase.google.com/docs/auth/admin/custom-claims

Вы должны определить правило доступа администратора:

{
  "rules": {
    "adminContent": {
      ".read": "auth.token.admin === true",
      ".write": "auth.token.admin === true",
    }
  }
}

Задайте роль пользователя в SDK Firebase Admin:

// Set admin privilege on the user corresponding to uid.
admin.auth().setCustomUserClaims(uid, {admin: true}).then(() => {
  // The new custom claims will propagate to the user ID token the
  // next time a new one is issued.
});

Это будет распространяться на соответствующие требования к токенам идентификатора пользователя. Вы можете принудительно обновить токен сразу после: user.getIdToken(true)

Чтобы проанализировать его из токена на клиенте, вам нужно base64 расшифровать полезную нагрузку на токен ID: https://firebase.google.com/docs/auth/admin/custom-claims#access_custom_claims_on_the_client

Вы можете обновить/понизить пользователей по мере необходимости. Они также предоставили программный способ перечислить всех пользователей, если у вас есть повторяющиеся сценарии для изменения уровней доступа пользователей: https://firebase.google.com/docs/auth/admin/manage-users#list_all_users