2013-08-07 17 views
9

Ho alcuni Meteor methods e voglio proteggerli in modo che solo alcuni utenti possano chiamarli dal client. Tuttavia, questi metodi vengono anche utilizzati dal server. Sono passato l'userid in this.userid in modo da poter verificare se l'utente è loggato e se sono autorizzati a effettuare la chiamata, nessun problema. Ma quando ho anche bisogno di chiamare il metodo dal lato server come faccio a sapere che si trattava di una chiamata al server in modo da poter consentire al metodo di eseguire. Verifica che non ci sia questo user.userid per determinare se la sua chiamata al server consente agli utenti non autenticati di chiamare anche il metodo. Sto cercando un modo per determinare se il metodo è stato chiamato dal server in modo che possa consentirlo e ancora impedire agli utenti non autenticati di chiamare il metodo.E 'possibile determinare se un metodo Meteor è stato chiamato dal server

Meteor.methods({ 
    makeCoffee: function (time) { 
    check(time, Number); 
    if(calledByServer || (Meteor.user() && Meteor.user().profile.usertype === 'coffee dude')){ 
      //Makin' Coffee 
    } 
    else 
     throw new Meteor.Error(404, "Can't find my pants"); 
    return "Coffee will be made at " + time; 
    } 
+2

Forse makeCoffee è in realtà una funzione sul server. L'accesso al client può essere controllato avvolgendolo in un metodo che controlla l'ID utente. Le chiamate al server passano sempre direttamente alla funzione. – user728291

+0

È vero, questa è la soluzione che probabilmente userò. Ma rinuncio ai vantaggi dei metodi meteor, come usare this.unblock() per eseguire più metodi in fibre diverse. – Dsyko

risposta

12

this.connection sarà null all'interno di un metodo lato server se il metodo non è stato chiamato da un client

Vedere le this.connection docs.

+0

Qualcuno ha trovato una soluzione che funzioni anche in funzioni chiamate dal metodo? In questo momento, non appena si entra in ** qualsiasi ** funzione, 'this.connection' sarà' null' (perché si sta entrando in un altro contesto JS per 'this'). –

+0

@neopostmodern Perché non utilizzare la stessa soluzione che usiamo sempre in Javascript? All'interno del metodo 'var methodConn = this.connection' - allora puoi usare' methodConn' dalle tue funzioni di callback. –

+0

Ho visto questo anche nel manuale, ma ho avuto paura - è sicuro? – Alveoli

4

Sembra Meteor.call può essere chiamato da lato server anche ora: http://docs.meteor.com/#meteor_call

risposta originale:

Make it in questo modo:

makeCoffee = function (time) { //code here } 

Meteor.methods({ 
    makeCoffeeMethod: function (time) { 
    if (calledByAllowedUser()) 
     return makeCoffee(time); 
    else 
     throw new Meteor.Error(403, 'Forbidden'); 
    } 
}); 

Ora può chiamarlo sul server bypassando l'autenticazione.

Problemi correlati