estoy teniendo problemas para encontrar documentación sobre el argumento de peticiones de objetos utilizados en los filtros de replicación ('req' en el ejemplo siguiente):CouchDB: La restricción de los usuarios solamente replicar sus propios documentos
function(doc, req) {
// what is inside req???
return false;
}
Este old CouchBase blog post tiene una pequeño fragmento de código que muestra que la variable userCtx es una parte del objeto de solicitud:
¿Qué es este usuario CTx? Cuando realiza una solicitud autenticada contra CouchDB, ya sea mediante HTTP basic auth, secure cookie auth o OAuth, CouchDB verificará las credenciales del usuario. Si coinciden con un usuario de CouchDB , rellena el objeto req.userCtx con información sobre el usuario .
Este objeto userCtx es extremadamente útil para restringir la replicación de documentos al propietario del documento. Echa un vistazo a este ejemplo:
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;
}
Pero el problema ahora es que CouchDB requiere el método de filtro para ser elegido de forma explícita por el iniciador de la replicación (en este caso, el iniciador es un usuario móvil de mi aplicación web):
curl -X POST http://127.0.0.1:5984/_replicate \
-d '{"source":"database", \
"target":"http://example.com:5984/database", \
"filter":"example/filtername"
}'
La pregunta
¿hay una manera de hacer cumplir un filtro específico por defecto para que los usuarios se limitan a replicar únicamente sus propios datos? Estoy pensando que la mejor manera de hacerlo es usar una interfaz de usuario para CouchDB, como Nginx, y restringir todas las solicitudes de replicación a las que incluyen ese filtro. ¿Pensamientos? Me encantaría una manera de hacer esto sin otra capa frente a CouchDB.
+1 Mi idea era usar nginx para restringir el tráfico de replicación única para que los usuarios no pueden hacer peticiones explícitas sobre los documentos u opiniones concretas. Tendré que buscar reescrituras. – pokstad
@pokstad esta es una idea simple e intuitiva, pero "buggy" ya que hay muchas maneras de solucionarlo: document API, cambios de fuentes, vistas, listas, shows, reescrituras: sus reglas de nginx serán bastante grandes y crecerán en el tiempo . El patrón de CouchDB para este problema son las bases de datos personales de los usuarios que contienen solo aquellas informaciones que el usuario puede leer y, probablemente, cambiar. Fácil de configurar, fácil de administrar, fácil de mantener datos seguros.Nginx en este caso podría ocultar este hecho proporcionando urls comunes para cada usuario, pero mejor para mantener las cosas explícitas (imho). – Kxepal
Gracias, investigaré esa ruta. ¿Existe una buena guía para implementar un entorno de base de datos de sofá por usuario? – pokstad