2012-04-11 7 views

答えて

21

[UPDATE]コレクションを確保するためのさまざまなソリューションを提供し、公式文書化し、認証パッケージが用意されました。 CRUDレベルで

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

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

ソース:Getting Started with Auth(ダン・dascalescu @のおかげで)


[OLD ANSWER]

はどうやら認証パッケージにそこ作業している上、完全な制御を取る任意のユーザーを避けるべきです(?)今のところdb。また、独自の突然変異(メソッド)を定義して既存の解決策(回避策)があり、不正な操作を実行しようとすると失敗することを示唆している人もいます。私はそれをはるかに良くしませんでしたが、Authパッケージが行レベルで通常の認証ロジックを実装できるようになるとは思えないので、これはしばしば必要になると思います。開発者が何を言わなければならないかを見なければならないでしょう。

[EDIT] 私の考えを確認しているようだが見つかり何か:

現在クライアントがコレクションへの完全な書き込みアクセス権を与えられています。彼らは任意のMongo更新コマンドを実行できます。認証を作成すると、クライアントの直接アクセスを挿入、更新、削除するように制限できます。バリデータやその他のORM風の機能も検討しています。この回答の

出典:

Accessing to DB at client side as in server side with meteor

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

+0

あなたの考えとリンクをありがとう! – TK421

+0

また、Quoraのこのスレッドは、Meteor開発者の回答から入手してください:http://www.quora.com/Meteor-web-framework/Whats-cool-about-Meteor/answer/Rory-I-Sinclair/comment/878076 – dentarg

+1

@nrako:https://github.com/meteor/meteor/wiki/Getting-Started-with-Authに言及する回答を更新することはできますか? –

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を使用してメソッドを作成する必要があります。Meteor.methodは、サーバー上で実行され、データベースへの書き込みを実行します。

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

+0

すごく、ありがとう、すべての情報!これが成熟しているのを待つことはできません。 – TK421

+0

コレクションをクライアントから読み取らないようにすることもできますか? – HansPinckaers

+1

Nevermind;自動公開を削除するだけです。 'meteor remove autopublish' – HansPinckaers

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 
+0

v0.5.0では認証が導入されているため、これはもはや必要ではないことに言及したいと思います。 http://docs.meteor.com/#accounts_apiを参照してください。 @greg:あなたの答えを更新する可能性がありますか? –

1

私は流星に新しいですが、私がこれまでに遭遇していることはあなたは、クライアントがサーバ側でfindコマンドにパラメータを追加することで、データベースにアクセスすることができますどのよう制限することができ、これらの二つの点

  1. あるpublishコマンド。クライアントがCollection.find({})を呼び出したときに、返される結果は、(私は流星0.5を持っているに建設され、例えば、Collection.find({user: this.userId})(もPublish certain information for Meteor.users and more information for Meteor.userhttp://docs.meteor.com/#meteor_publishを参照)

  2. 一つのことになり、サーバー側でどのように対応しています。 9)は、クライアントがIDで項目updateのみを使用できるようになり、セレクタを使用しないことです。準拠していない試行がある場合、クライアントのコンソールにエラーが記録されます。 403: "Not permitted. Untrusted code may only update documents by ID."Understanding "Not permitted. Untrusted code may only update documents by ID." Meteor error参照)。数2の観点

、あなたはMeteor.callでクライアントが利用可能なリモート・プロシージャ・コールを行うために、サーバー側でMeteor.methodsを使用する必要があります。

関連する問題