11

クライアントにコレクションへのアクセスを許可したくないが、クライアントがそのコレクション内のオブジェクトについて特定の質問をできるようにしたいとします。どうすればこれを達成できますか?

例として、現在ログインしているユーザーがいるかどうかを知りたいとします。ユーザーが最初にログインするときに、そのユーザーのデータベースIDをSessionCookieに設定します。現在、アプリケーションは、ユーザーがログインしていると言っていますが!Session.equals("user_id", null)、これはもちろん非常に安全ではありません。これは、firebugを開いて言うことができ、Session.set("user_id", "foo")ログインしているためです。

この時点で、クライアントがUsersコレクションにアクセスできるようにしたくありません。このコレクションにアクセスできる唯一のクライアントコードは、それを保護するために自己実行関数で囲まれています(Meteorでセキュリティを行う正しい方法かどうかはわかりませんので、これらの行に沿って何かをお勧めします同じように)。その代わりに、サーバー側のコードを呼び出して、セッションで設定されたIDを渡し、それが有効なユーザーであるかどうかを教えてもらいたいと思います。

セットアップを確認したいのは次のとおりです。

// client
function logged_in() {
  return SomeServerMethodThatValidatesUserId(Session.get("user_id"));
}

Meteor.methodsMeteor.call非同期コールバックを実行するため、法案に適合しないようです。pub / subモデルはもう少し有望に見えますが、ドキュメントからは、それがどのように機能するかはよくわかりません。

クライアントでいくつかの値を設定するために、公開ハンドラー内から呼び出す必要があることを示唆しているようですthis.setが、それらの値が利用可能になる場所がわかりません。

あるいは、pub / subモデルもこれに適していない可能性があり、私が見逃している別の方法があります。アドバイスをいただければ幸いです。

4

2 に答える 2

6

認証されるまでクライアントがデータにアクセスするのを制限しようとしているようです。これを行う1つの方法は次のとおりです。

まず、引数Meteor.publishを取る関数をサーバーに記述します。user_id関数は、特権サーバー環境で必要なチェックを実行し、最終的にカーソルを返します。簡単な例は次のとおりです。

// define collection on both client and server
Users = new Meteor.Collection('users');

// server-side publish
Meteor.publish('my-user', function (user_id) {
  if (someServerMethodThatValidatesUserId(user_id))
    // publish a single user object to the client
    return Users.find({_id: user_id});
});

次に、クライアントで、手元にあるmy-userセットをサブスクライブします。user_id

// client-side
Meteor.subscribe('my-user', Session.get('user_id'));

user_idこれで、サーバー上で実行される特権関数によって決定されるように、が有効である場合にのみ、クライアントのユーザーに1つのドキュメントが作成されsomeServerMethodThatValidatesUserIdます。

this.setMongoクエリに依存するのではなく、クライアントに送信される特定のドキュメントを手動で管理する場合は、公開機能内で使用できます。ただし、ここではそのようなことは必要ないと思います。)

于 2012-04-22T04:51:53.160 に答える
1

これは、Meteorが認証を受ける前の時代からの古い質問です。TL;DRの答えは次のとおりです。

meteor remove autopublish

次に、独自のコレクション、パブリケーション、およびサブスクリプションを管理します

于 2014-03-06T11:57:27.573 に答える