2013-08-07 17 views
9

Mam pewne Meteor methods i chcę je zabezpieczyć, aby tylko niektórzy użytkownicy mogli wywoływać je od klienta. Jednak te metody są również używane przez serwer. Zostaję przekazany identyfikator użytkownika w this.userid, dzięki czemu mogę sprawdzić, czy użytkownik jest zalogowany i czy może wykonać połączenie, bez problemu. Ale kiedy muszę również wywołać metodę ze strony serwera, jak określić, że to było wywołanie serwera, więc mogę zezwolić na wykonanie metody. Sprawdzanie, czy nie istnieje this.userid w celu ustalenia, czy jego wywołanie serwera umożliwia nieuwierzytelnionym użytkownikom wywoływanie metody. Szukam sposobu, aby ustalić, czy metoda została wywołana przez serwer, więc mogę go zezwolić i nadal uniemożliwia nieuwierzytelnionych użytkowników wywoływanie metody.Czy możliwe jest określenie, czy metoda Meteor została wywołana przez serwer?

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

Może makeCoffee jest rzeczywiście funkcją na serwerze. Dostęp klienta może być kontrolowany przez zawijanie go w metodzie, która sprawdza userId. Wywołania serwera zawsze idą prosto do funkcji. – user728291

+0

Prawda, to jest rozwiązanie, które prawdopodobnie wykorzystam. Ale rezygnuję z zalet metod meteorologicznych, takich jak użycie this.unblock() do uruchamiania wielu metod w różnych włóknach. – Dsyko

Odpowiedz

12

this.connection będzie null wewnątrz metody po stronie serwera, jeśli metoda nie została wywołana z klientem

Zobacz this.connection docs.

+0

Czy ktoś znalazł rozwiązanie, które będzie działać w funkcjach wywoływanych z tej metody? Teraz, gdy tylko wejdziesz w funkcję ** any, to 'this.connection' będzie miało wartość' null' (ponieważ wpisujesz inny kontekst JS dla 'this'). –

+0

@neopostmodern Dlaczego nie używać tego samego rozwiązania, którego używamy zawsze w JavaScript? Wewnątrz metody 'var methodConn = this.connection' - wtedy możesz użyć' methodConn' z funkcji wywołania zwrotnego. –

+0

Widziałem to również w instrukcji, ale się wystraszyłem - czy to jest bezpieczne? – Alveoli

4

Wygląda Meteor.call można nazwać od strony serwera zbyt teraz: http://docs.meteor.com/#meteor_call

Oryginalny odpowiedź:

Zrób to tak:

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

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

teraz ty może wywołać to na serwerze, omijając uwierzytelnianie.

Powiązane problemy