2013-04-11 5 views
6

Nous aimerions utiliser Firepad dans notre projet (la plupart du temps non hébergé par Firebase), mais nous rencontrons quelques problèmes pour trouver la meilleure façon d'aborder le problème.Firebase JSON Security and Arrays

Fondamentalement, nous avons beaucoup d'utilisateurs, et chaque utilisateur peut être membre de plusieurs groupes. Ces "groupes" ont chacun leur propre Firepad que les utilisateurs peuvent modifier. Nous avons déjà une structure de base de données profondément développée utilisant MySQL et ne souhaitons pas vraiment migrer nos données utilisateur dans Firebase pour le moment, nous avons donc pensé que nous serions plus créatifs.

Nous ne voulons pas que les utilisateurs puissent éditer les Firepads des groupes auxquels ils n'appartiennent pas. En tant que tel, dans le cadre de notre jeton d'authentification, nous avons pensé que nous essaierions d'envoyer le nom d'utilisateur et la liste des groupes auxquels ils appartiennent. Ensuite, en utilisant le système de sécurité Firebase JSON, nous avons pu vérifier que le Firepad en cours d'édition figure dans la liste des groupes auxquels l'utilisateur appartient.

Le problème est que le système JSON ne semble pas accepter beaucoup de commandes. Il n'y a pas indexOf, et je ne peux pas appeler hasChild sur la variable auth.

Comment pouvons-nous nous assurer que les utilisateurs ne peuvent modifier que les Firepads des groupes auxquels ils appartiennent, sans migrer toutes nos données vers Firebase? (Ou en conservant deux copies de la base de données - une sur MySQL et une sur Firebase)

Répondre

9

L'astuce ici est d'utiliser un objet au lieu d'un tableau pour stocker les groupes (un peu bizarre, je sais. rendre ceci plus facile/plus intuitif). Donc, dans votre jeton auth, vous souhaitez stocker quelque chose comme:

{ userid: 'blah', groups: { 'group1': true, 'group2': true, ... } } 

Et puis dans vos règles de sécurité que vous pourriez avoir quelque chose comme:

{ 
    ... 
    "$group": { 
     ".read": "auth.groups[$group] == true", 
     ".write": "auth.groups[$group] == true" 
    } 
} 

Et puis un utilisateur aura accès en lecture/écriture à/groups/<groupe> uniquement si < le groupe > est dans leur jeton d'authentification.

+0

Bingo. J'aurais probablement dû y penser, mais il est utile de préciser que l'accès aux membres entre crochets est possible. Je vous remercie! –

+0

Mike, avez-vous apporté des améliorations dans ce domaine? Existe-t-il des documents décrivant les fonctions disponibles pour la variable auth? – Samuel

+0

@Samuel Aucun changement particulier ici. En général, auth n'a pas de fonctions, c'est juste les données dans votre jeton d'authentification. La seule "fonction" disponible est si vous avez une chaîne dans vos données d'authentification, il y a quelques méthodes pour faire correspondre la sous-chaîne/regex, etc .: https://www.firebase.com/docs/security/api/string/ –