2012-04-22 15 views
11

Diciamo che non voglio che il mio cliente abbia accesso a una raccolta, ma voglio che il mio cliente sia in grado di porre alcune domande sugli oggetti all'interno di quella raccolta. Come potrei ottenere questo?Ottenere valori dal server

Ad esempio, supponiamo di voler sapere se al momento è presente un utente che ha effettuato l'accesso. Quando un utente accede per la prima volta, imposto l'ID del database dell'utente in Session e in un cookie. Attualmente, l'applicazione dice un utente è connesso in se !Session.equals("user_id", null), che naturalmente è molto insicuro perché ora posso aprire Firebug e dire Session.set("user_id", "foo") e ora sto loggato.

non voglio il cliente di avere accesso alla collezione Users a questo punto. L'unico codice client che ha accesso a questa raccolta è racchiuso in una funzione self-executing nel tentativo di proteggerlo (non sono sicuro che sia il modo giusto di fare sicurezza in Meteor, quindi sentiti libero di raccomandare qualcosa lungo quelle linee anche). Quindi preferirei chiamare un codice lato server e passargli l'id che è impostato in sessione e dirmi se è un utente valido o meno.

Ecco come mi piacerebbe vederlo di impostazione:

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

Meteor.methods non sembra per adattarsi al disegno di legge, in quanto Meteor.call esegue un callback asincrono. Il modello pub/sub sembra un po 'più promettente, ma dalla documentazione, non sono abbastanza sicuro di come funzioni.

Sembra suggerire che dovrei chiamare this.set dall'interno del gestore di pubblicazione per impostare alcuni valori sul client, ma non riesco a capire dove quei valori diventano disponibili.

O forse anche il modello pub/sub non è adatto a questo e c'è un altro modo che mi manca. Qualche consiglio è apprezzato!

+1

Dai un'occhiata a questa risposta di uno degli sviluppatori di Meteor: http: // stackoverflow.it/questions/10115042/how-do-you-secure-the-client-side-mongodb-api/10116342 # 10116342 Mostra come disattivare le "rotelle di addestramento" predefinite che consentono al client e al server di eseguire comandi arbitrari di mongo. Quindi puoi esporre solo ciò che desideri al cliente tramite Meteor.methods e Meteor.publish. Questo sarà semplificato quando verrà rilasciato il pacchetto di autenticazione di Meteor. – rmarscher

risposta

6

Sembra che tu stia cercando di impedire al client di accedere ai dati finché non è stato autenticato. Ecco un modo per farlo:

Innanzitutto, scrivere una funzione Meteor.publish sul server che accetta un argomento user_id. La tua funzione esegue tutto ciò che vuoi nell'ambiente server privilegiato e alla fine restituisce un cursore. Un esempio semplice potrebbe essere:

// 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}); 
}); 

Poi sul client, iscriviti al gruppo my-user volta che hai un user_id in mano:

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

Ora, avrete un documento in Utenti sul client se e solo se lo user_id era valido, come determinato dalla funzione privilegiata someServerMethodThatValidatesUserId che viene eseguita sul server.

(this.set è disponibile all'interno della funzione di pubblicazione se si desidera gestire manualmente i documenti specifici che vengono inviati al client, invece di fare affidamento su una query Mongo. Ma non credo che nulla del genere sia necessario qui.)

+1

Sembra che creerebbe un conflitto con altre parti del mio codice cliente che vogliono accedere alla mia intera collezione di utenti, vero? – Samo

+0

questo non è male, anche se l'utente decide di modificare il valore di sessione di 'user_id' il server verrà comunque convalidato. – Adgezaza