2015-05-11 7 views
5

Ho un elenco di record in firebase che avrà una proprietà di gruppo con zero o più gruppi su di esso. Ho anche l'oggetto auth firebase che avrà anche zero o più gruppi su di esso. Vorrei impostare una regola di Firebase per i miei record che verificherà se i due hanno in affitto un gruppo che esiste in entrambi gli elenchi.Come utilizzare la regola di Firebase per controllare è array di gruppi di utenti e array di gruppi di record intersecano

In un altro modo ho un utente che ha una matrice di gruppi che sono stati assegnati ad esso. Ho alcuni record che contengono anche alcuni elenchi di gruppi che specificano quali gruppi l'utente deve avere per accedervi. Se l'utente che ha effettuato l'accesso tenta di accedere al record, voglio assicurarmi che l'utente abbia almeno un gruppo richiesto dal record.

Sul client vorrei fare qualcosa di simile _.intersect(userGroups, recordGroups).length > 0

io non sono sicuro di come avrei fatto questo in un espressione regola Firebase. Sarebbe bello se funzionasse qualcosa del genere.

Record:

{ 
    someData: "test" 
    groups: ['foo', 'bar'] 
} 

Firebase Auth Oggetto:

{ 
    userName: "Bob", 
    groups: ['foo', 'bar'] 
} 

Regola dati:

{ 
    "rules": { 
    "records": { 
     "$recordId": { 
     ".read": "data.child('groups').intersectsWith(auth.groups)" 
     } 
    } 
    } 
} 

Grazie.

Aggiornamento: Penso che se hasChildren() utilizzata || invece di & & potrei mettere i nomi dei gruppi nella loro posizione chiave e controllare la loro esistenza in questo modo. Qualcosa di simile "data.child('groups').hasChildren(auth.groups, 'or')"

Dove Record:

{ 
    someData: "test" 
    groups: { 
    'foo': '', 
    'bar': '' 
    } 
} 

Update2: base al largo il commento di Kato & collegamento mi rendo conto che, anche se hasChildren potesse fare o che ancora non avrebbe funzionato perfettamente ragione. Le richieste per i singoli record funzionerebbero ma le richieste per tutti i record sarebbero errate se l'utente corrente non avesse accesso ad ogni record.

Non è ancora chiaro come strutturare i dati per far funzionare questo. Se un record potesse appartenere a molti gruppi, come funzionerebbe? Questo è uno scenario molto comune (fondamentalmente come funzionano le autorizzazioni del gruppo linux) quindi non posso essere l'unico a provare a farlo. Qualcuno ha idee/esempi su come ottenere questo risultato in Firebase?

+0

regole di sicurezza Firebase [non possono essere utilizzati come filtri] (https://www.firebase.com/docs/security/guide/securing-data.html # sezione-filtro). Probabilmente vorrai memorizzare i tuoi record per gruppo se è così che devono essere recuperati. – Kato

+0

Non so come funzionerebbe. Gli utenti appartengono a molti gruppi e i record appartengono a molti gruppi. Fintanto che entrambi hanno un gruppo in comune, l'accesso dovrebbe essere fornito. – yodaisgreen

+0

Qualche aggiornamento a questo? Ho un problema simile [qui] (http://stackoverflow.com/questions/34078703/proper-firebase-security-rules-for-implementing-rbac) –

risposta

0

Al momento attuale, credo sia impossibile. C'è un numero limitato di variabili, metodi e gli operatori autorizzati, elencati qui:

Firebase Security Rules API

Poiché le definizioni di funzioni non sono ammessi nelle regole, non si può fare nulla di fantasia come chiamata array.some (richiamata) su un array per fare da soli l'abbinamento.

Sono disponibili tre opzioni, che io sappia:

1) copiare i dati in modo che non c'è bisogno di fare il check.Questo è ciò che ho fatto nel mio progetto: volevo che alcuni dati utente (nomi) fossero disponibili per gli utenti che condividevano una rete nei loro elenchi di reti. Originariamente volevo controllare gli elenchi della rete di entrambi i membri per vedere se c'era almeno una corrispondenza. Alla fine mi sono reso conto che sarebbe stato più semplice salvare semplicemente il nome di ciascun utente come parte dei dati di rete, quindi non ci dovrebbe essere una ricerca da parte dell'utente che richiede queste strane autorizzazioni. Non ne so abbastanza dei tuoi dati per suggerire ciò che devi copiare.

2) Utilizzare stringhe anziché matrici. Puoi trasformare una stringa in un'espressione regolare (o semplicemente salvarla in formato regex) e usarla per cercare l'altra stringa per una corrispondenza. Firebase DB Regex Docs

3) Se si dispone di casi abbastanza strani come questo, in realtà viene eseguito un server che convalida la richiesta in modo personalizzato. Nel DB, autorizza solo le autorizzazioni al tuo server. Si potrebbe utilizzare Firebase Cloud Functions o rotolare il proprio server che utilizza le Firebase Admin SDK