2012-04-22 18 views
11

Digamos que no quiero que mi cliente tenga acceso a una colección, pero sí quiero que mi cliente pueda hacer ciertas preguntas sobre los objetos dentro de esa colección. ¿Cómo lograría esto?Obtener valores del servidor

Como ejemplo, digamos que quiero saber si actualmente hay un usuario conectado. Cuando un usuario inicia sesión por primera vez, configuro la identificación de la base de datos de ese usuario en Session y en una cookie. Actualmente, la aplicación dice un usuario se registra en si !Session.equals("user_id", null), que por supuesto es muy inseguro porque ahora puedo abrir Firebug y decir Session.set("user_id", "foo") y ahora estoy conectado.

no quiero que el cliente tenga acceso a la colección de usuarios en este punto. El único código de cliente que tiene acceso a esta colección está encerrado en una función autoejecutable en un esfuerzo por protegerlo (no estoy muy seguro de si esa es la manera correcta de hacer la seguridad en Meteor, así que siéntase libre de recomendar algo en esa línea también). Así que, en cambio, me gustaría llamar a algún código del lado del servidor y pasarle el ID que está en sesión y hacer que me diga si ese es un usuario válido o no.

Así es como me gustaría ver que la configuración:

// client 
function logged_in() { 
    return SomeServerMethodThatValidatesUserId(Session.get("user_id")); 
} 

Meteor.methods no parece ajustarse a la ley, ya que Meteor.call realiza una devolución de llamada asincrónica. El modelo de pub/sub se ve un poco más prometedor, pero a partir de la documentación, no estoy muy seguro de cómo funciona.

Parece sugerir que debo llamar al this.set desde el controlador de publicación para establecer algunos valores en el cliente, pero no puedo determinar dónde están disponibles esos valores.

O tal vez el modelo de pub/sub no es el adecuado para esto y hay otra manera en la que me estoy perdiendo. ¡Cualquier consejo es apreciado!

+1

Echa un vistazo a esta respuesta de uno de los desarrolladores de Meteor: http: // stackoverflow.com/questions/10115042/how-do-you-secure-the-client-side-mongodb-api/10116342 # 10116342 Muestra cómo desactivar las "ruedas de entrenamiento" predeterminadas que permiten al cliente y al servidor ejecutar comandos de mongo arbitrarios. Luego, puede exponer solo lo que desea al cliente a través de Meteor.methods y Meteor.publish. Esto se simplificará cuando se libere el paquete de autenticación Meteor. – rmarscher

Respuesta

6

Parece que está intentando restringir al cliente el acceso a los datos hasta que se hayan autenticado. Aquí hay una manera de hacerlo:

Primero, escriba una función Meteor.publish en el servidor que toma un argumento user_id. Su función hace la verificación que desee en el entorno de servidor con privilegios y, finalmente, devuelve un Cursor. Un ejemplo sencillo sería:

// define collection on both client and server 
Users = new Meteor.Collection('users'); 

// server-side publish 
Meteor.publish('my-user', function (user_id) { 
    if (someServerMethodThatValidatesUserId(user_id)) 
    // publish a single user object to the client 
    return Users.find({_id: user_id}); 
}); 

A continuación, en el cliente, suscríbase al conjunto my-user vez que haya una user_id en la mano:

// client-side 
Meteor.subscribe('my-user', Session.get('user_id')); 

Ahora, tendrá un documento en usuarios de la cliente si y solo si el user_id era válido, como lo determina su función privilegiada someServerMethodThatValidatesUserId que se ejecuta en el servidor.

(this.set) está disponible dentro de su función de publicación si desea administrar manualmente los documentos específicos que se envían al cliente, en lugar de confiar en una consulta de Mongo. Pero no creo que sea necesario algo así.)

+1

Parece que crearía un conflicto con otras partes de mi código de cliente que desean acceder a toda mi colección de usuarios, ¿o no? – Samo

+0

esto no está mal, incluso si el usuario decide cambiar el valor de sesión de 'user_id' el servidor validará de todos modos. – Adgezaza

Cuestiones relacionadas