web-dev-qa-db-fra.com

comment implémenter le contrôle d'accès basé sur les rôles dans firebase

C'est ma première incursion dans Firebase & nosql, je viens d'un background SQL.

À l'aide de l'e-mail/mot de passe de sécurité de connexion simple, comment limiter l'accès aux données dans Firebase? Par exemple, certains utilisateurs auront accès à la création d'un objet métier (utilisateurs, clients, catégories, etc.), d'autres non. Existe-t-il un moyen d'attacher une liste d'autorisations à la variable "auth"?

34
acole76

Il n'y a aucun moyen d'attacher des autorisations directement à la variable d'authentification (ou du moins cela ne semble pas être une stratégie voulue). Je recommanderais de créer une collection d'utilisateurs organisée par auth.uid et vous pouvez y conserver le type d'attributs d'autorisation que vous souhaitez, de sorte que vos règles de sécurité puissent ressembler à ceci (non testé):

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

role est un attribut appartenant à tous les objets de votre collection users.

MISE À JOUR

Voir commentaire ci-dessous:

"Il n'y a aucun moyen d'attacher des autorisations directement à la variable d'authentification". Cela a changé en 2017. Vous pouvez désormais attacher des revendications personnalisées à un profil d'authentification, qui sont disponibles dans les règles de sécurité. Voir la réponse de bojeil et la documentation Firebase pour les réclamations personnalisées. - Frank van Puffelen

33
hiattp

Firebase a lancé la prise en charge de l'accès basé sur les rôles pour tout utilisateur via des revendications d'utilisateur personnalisées sur le jeton d'ID: https://firebase.google.com/docs/auth/admin/custom-claims

Vous définiriez la règle d'accès administrateur:

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

Définissez le rôle d'utilisateur avec le SDK Admin Firebase:

// 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's ID token the
  // next time a new one is issued.
});

Cela se propagera aux revendications de jeton d'ID de l'utilisateur correspondant. Vous pouvez forcer l'actualisation du jeton immédiatement après: user.getIdToken(true)

Pour l'analyser à partir du jeton sur le client, vous devez décoder en base64 la charge utile du jeton ID: https://firebase.google.com/docs/auth/admin/custom-claims#access_custom_claims_on_the_client

Vous pouvez mettre à niveau/rétrograder les utilisateurs selon vos besoins. Ils ont également fourni un moyen par programme de répertorier tous les utilisateurs si vous avez des scripts récurrents pour modifier les niveaux d'accès des utilisateurs: https://firebase.google.com/docs/auth/admin/manage-users#list_all_users =

9
bojeil

En réexaminant cela un an plus tard, des "jetons personnalisés" peuvent être une meilleure option.

https://www.firebase.com/docs/security/guide/user-security.html#section-custom

8
Jamey McElveen