2013-08-07 4 views
9

私はいくつかのMeteor methodsを持っており、特定のユーザだけがクライアントから呼び出せるようにそれらを保護したいと思います。ただし、これらのメソッドはサーバーでも使用されます。私はthis.useridにuseridが渡されているので、ユーザーがログインしているかどうか、そして電話をかけることができるかどうかは問題ではありません。しかし、私はまた、サーバー側からメソッドを呼び出す必要があるときに、メソッドを実行できるようにするために、それがサーバー呼び出しであることをどのように判断するのですか。このサーバー・コールが認証されていないユーザーにもメソッドを呼び出すことを許可するかどうかを判断するthis.useridがないことを確認します。私はそれが許可することができ、未認証のユーザーがメソッドを呼び出すのを防ぐことができるように、メソッドがサーバーによって呼び出されたかどうかを判断する方法を探しています。 Meteor.callがあまりにも今、サーバ側から呼び出すことができるようにMeteorメソッドがサーバによって呼び出されたかどうかを確認することは可能ですか

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

おそらく、makeCoffeeは実際にはサーバー上の関数です。クライアントアクセスは、userIdをチェックするメソッドでラップすることで制御できます。サーバーコールは常に関数に直接渡されます。 – user728291

+0

真実、これはおそらく私が使用することになる解決策です。しかし、私は流星法のいくつかの利点をあきらめています。これは、this.unblock()を使ってさまざまな繊維で複数のメソッドを実行するようなものです。 – Dsyko

答えて

12

this.connection

this.connection docsを参照してください。サーバー側のメソッド内nullになります。

+0

誰かがこのメソッドから呼び出された関数でも動作する解決策を見つけましたか?今すぐあなたが**任意の**機能に入ると、 'this.connection'は' null'になります(これは 'this'のために別のJSコンテキストを入力するためです)。 –

+0

@neopostmodern私たちが常にJavascriptで使用するのと同じソリューションを使用してみませんか? 'var methodConn = this.connection'メソッドの中で、あなたのコールバック関数から' methodConn'を使うことができます。 –

+0

マニュアルでこれを見ていましたが、気になってしまった - 安全ですか? – Alveoli

4

が見える: http://docs.meteor.com/#meteor_call

オリジナルの答え:今、あなた

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

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

このようにそれを作ります認証をバイパスしてサーバー上で呼び出すことができます。メソッドは、クライアントから呼び出されなかった場合