31

すべてのユーザーがデータを挿入/破棄できるようにしたくありません。

4

4 に答える 4

33

これを行うための文書化された方法はまだありませんが、必要なことを行うコードを次に示します。

Foo = new Meteor.Collection("foo");
...
if (Meteor.is_server) {
   Meteor.startup(function () {
       Meteor.default_server.method_handlers['/foo/insert'] = function () {};
       Meteor.default_server.method_handlers['/foo/update'] = function () {};
       Meteor.default_server.method_handlers['/foo/remove'] = function () {};
   });
}

これにより、デフォルトの挿入/更新/削除メソッドが無効になります。クライアントはデータベースへの挿入を試みることができますが、サーバーは何もせず、サーバーが応答すると、クライアントはローカルに作成されたアイテムに気付き、削除します。

挿入/更新/削除はサーバー上で引き続き機能します。データベースへの書き込みを行うには、サーバー上で実行される Meteor.methods を使用してメソッドを作成する必要があります。

認証ブランチが到着すると、これらすべてが変更されます。それが実現すると、サーバー上のデータベース書き込みを検査および承認するためのバリデーターを提供できるようになります。もう少し詳しく説明します: http://news.ycombinator.com/item?id=3825063

于 2012-04-12T01:43:26.907 に答える
21

[更新] コレクションを保護するためのさまざまなソリューションを提供する、公式で文書化された Auth パッケージ が用意されました。

CRUD レベル:

[サーバー] collection.allow(オプション) と collection.deny(オプション)。このコレクションのデフォルトの書き込み方法を制限します。これらのいずれかがコレクションで呼び出されると、安全でないパッケージに関係なく、そのコレクションのすべての書き込みメソッドが制限されます。

insecureまた、クライアントから完全な書き込みアクセスを削除することもあります。

source : Auth 入門(@dan-dascalescu に感謝)


[古い回答]

どうやら、現在のようにユーザーが db を完全に制御することを避けるべき Auth Package(?) に取り組んでいるようです。また、独自のミューテーション (メソッド) を定義し、許可されていないアクションを実行しようとすると失敗するようにすることで、既存のソリューション (回避策) があることを示唆する人もいます。私はそれをあまり良くしませんでしたが、Authパッケージが行レベルで通常の認証ロジックを実装できるとは思えないので、これはしばしば必要になると思いますが、おそらくCRUDメソッドでのみです. 開発者が何を言わなければならないかを見る必要があります。

[編集]私の考えを確認するようなものを見つけました:

現在、クライアントにはコレクションへの完全な書き込みアクセスが許可されています。任意の Mongo 更新コマンドを実行できます。認証を構築すると、挿入、更新、および削除に対するクライアントの直接アクセスを制限できるようになります。また、バリデーターやその他の ORM のような機能も検討しています。

この回答のソース:

meteor を使用してサーバー側と同じようにクライアント側で DB にアクセスする

https://stackoverflow.com/questions/10100813/data-validation-and-security-in-meteor/10101516#10101516

于 2012-04-12T00:27:11.987 に答える
9

より簡潔な方法:

_.each(['collection1', 'collection2'], function(collection){
    _.each(['insert','update', 'remove'], function(method){
      Meteor.default_server.method_handlers['/' + collection + '/' + method] = function(){}
    });
});

またはそれをより慣用的にするために:

隕石を伸ばす:

_.extend(Meteor.Collection.prototype, {
  remove_client_access: function(methods){
    var self = this;
    if(!methods) methods = ['insert','update','remove'];
    if(typeof methods === 'String') methods = [methods];
    _.each(methods, function(method){
      Meteor.default_server.method_handlers[self._prefix + method] = function(){}
    });
  }
});

呼び出しはより簡単です:

List.remove_client_access() // restrict all
List.remove_client_access('remove') //restrict one
List.remove_client_access(['remove','update']) //restrict more than one
于 2012-04-25T16:45:54.053 に答える