2012-10-07 15 views
6

Sto avendo difficoltà a trovare la documentazione sull'argomento oggetto di richiesta utilizzato in filtri di replica ('req' nel campione sotto):CouchDB: Limitazione degli utenti solo a replicare i propri documenti

function(doc, req) { 
    // what is inside req??? 
    return false; 
} 

Questo old CouchBase blog post ha un piccolo frammento di codice che mostra la variabile userCtx che fa parte dell'oggetto richiesta:

Che cos'è questo userCtx? Quando si effettua una richiesta autenticata contro CouchDB, utilizzando l'autenticazione di base HTTP, l'autenticazione del cookie sicuro o OAuth, CouchDB verificherà le credenziali dell'utente. Se corrispondono a un utente CouchDB , popola l'oggetto req.userCtx con informazioni sull'utente .

Questo oggetto userCtx è estremamente utile per limitare la replica di documenti al proprietario del documento. Dai un'occhiata a questo esempio:

function(doc, req) { 
    // require a valid request user that owns the current doc 
    if (!req.userCtx.name) { 
    throw("Unauthorized!"); 
    } 
    if(req.userCtx.name == doc.owner) { 
    return true; 
    } 
    return false; 
} 

Ma il problema ora è che CouchDB richiede il metodo del filtro essere esplicitamente scelto dal iniziatore della replica (in questo caso, l'iniziatore è un utente mobile della mia web app):

curl -X POST http://127.0.0.1:5984/_replicate \ 
-d '{"source":"database", \ 
    "target":"http://example.com:5984/database", \ 
    "filter":"example/filtername" 
    }' 

La questione

c'è un modo per far rispettare un filtro specifico per impostazione predefinita in modo che gli utenti sono limitati a replicare solo i propri dati? Sto pensando che il modo migliore per farlo è utilizzare un front end per CouchDB, come Nginx, e limitare tutte le richieste di replica a quelle che includono quel filtro. Pensieri? Mi piacerebbe un modo per farlo senza un altro livello di fronte a CouchDB.

risposta

5

La replica dei dati corrisponde alla capacità dell'utente di leggere i dati. Dal momento che se i tuoi utenti condividono i dati all'interno di un singolo database, tutti hanno il diritto di replicarli tutti nei loro divani locali. Pertanto, non è possibile applicare alcuna restrizione di lettura dei documenti a meno che non si sia diviso un singolo database condiviso in più di uno personale: si tratta di un caso di utilizzo comune in tali situazioni.

Non esiste alcun modo per applicare le modifiche applicate al filtro del feed o ad altri parametri come le viste. Tuttavia, è possibile utilizzare rewrites per avvolgere le richieste su alcune risorse con parametri di query predefiniti o anche con quelli dinamici. Questa non è una soluzione che ti aspettavi, ma ancora meglio che nginx e qualche logica al suo fianco: probabilmente, dovresti consentire agli utenti di specificare filtri personalizzati con parametri di query personalizzati e far rispettare la tua proprietà solo se non specificato , destra?

P.S. All'interno dell'oggetto req è molto utile la richiesta corrente. Parzialmente è stato descritto a wiki, ma è un po 'obsoleto. Tuttavia, è facile per vederlo con la semplice funzione spettacolo:

function(doc, req){ 
    return {json: req} 
} 
+0

+1 La mia idea era di usare nginx per limitare solo il traffico di replica in modo che gli utenti non possono fare richieste esplicite su documenti o viste specifiche. Dovrò esaminare le riscritture. – pokstad

+1

@pokstad questa è un'idea semplice e intuitiva, ma "bacata" dal momento che ci sono molti modi per aggirarla: API documento, cambia feed, viste, elenchi, spettacoli, riscritture - le tue regole nginx saranno abbastanza grandi e cresceranno nel tempo . Il modello CouchDB per questo problema è il database personale degli utenti che contiene solo quelle informazioni che l'utente può leggere e, probabilmente, potrebbe cambiare. Facile da configurare, facile da gestire, facile da proteggere.Nginx in questo caso potrebbe nascondere questo fatto fornendo url comuni per ogni utente, ma meglio mantenere le cose esplicite (imho). – Kxepal

+0

Grazie, esaminerò questa strada. C'è una buona guida per implementare un ambiente couchdb database per utente? – pokstad

Problemi correlati