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.
+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
@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
Grazie, esaminerò questa strada. C'è una buona guida per implementare un ambiente couchdb database per utente? – pokstad