2012-10-07 22 views
6

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.

Respuesta

5

La replicación de datos se encuentra justo con la capacidad del usuario para leer datos. Dado que si sus usuarios comparten datos en una única base de datos, todos ellos tienen derecho a replicarlos todos en sus sofás locales. Por lo tanto, no podría aplicar ninguna restricción de lectura de documentos a menos que haya dividido la base de datos compartida individual en varias personales: este es el caso de uso común para tales situaciones.

No hay ninguna forma de imponer cambios de aplicación filtro de alimentación u otros parámetros como vistas. Sin embargo, puede usar rewrites para envolver solicitudes a algunos recursos con parámetros de consulta predefinidos o incluso con dinámicos. Esta no es la solución que esperabas, pero aún mejor que nginx y algo de lógica a su favor: probablemente, permitirías a los usuarios especificar filtros personalizados con parámetros de consulta personalizados y exigir que seas tuyo solo si no se especifica nada , ¿derecho?

P.S. Dentro de req objeto es muy útil sobre la solicitud actual. Parcialmente se describió en wiki, pero está un poco desactualizado. Sin embargo, es fácil para visualizarla con función de presentación sencilla:

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

+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

+1

@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

+0

Gracias, investigaré esa ruta. ¿Existe una buena guía para implementar un entorno de base de datos de sofá por usuario? – pokstad

Cuestiones relacionadas