从服务器获取值

时间:2012-04-22 04:43:04

标签: meteor

假设我不希望我的客户端访问集合,但我确实希望我的客户能够询问有关该集合中对象的某些问题。我怎么做到这一点?

例如,假设我想知道当前是否有用户登录。当用户首次登录时,我会在Session和cookie中设置该用户的数据库ID。目前,该应用程序表示用户已登录!Session.equals("user_id", null),这当然是非常不安全的,因为现在我可以打开萤火虫并说Session.set("user_id", "foo"),现在我已登录。

我不希望客户端此时有权访问Users集合。有权访问此集合的唯一客户端代码包含在自动执行功能中以保护它(我不确定这是否是在Meteor中执行安全性的正确方法,因此请随意推荐这些内容。以及)。所以相反,我想调用一些服务器端代码,并将其传递给会话中设置的id,让它告诉我这是否是一个有效的用户。

以下是我希望看到它的设置:

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

Meteor.methods似乎不符合要求,因为Meteor.call执行异步回调。 pub / sub模型看起来更有前途,但从文档中,我不太确定它是如何工作的。

似乎建议我应该在发布处理程序中调用this.set以便在客户端上设置一些值,但我无法弄清楚这些值的可用位置。

或许pub / sub模型也不适合这种情况,还有另一种方法,我错过了。任何建议表示赞赏!

2 个答案:

答案 0 :(得分:6)

听起来你试图限制客户端访问数据,直到它经过身份验证。这是一种方法:

首先,在服务器上写一个带有Meteor.publish参数的user_id函数。您的函数在特权服务器环境中执行您想要的任何检查,并最终返回Cursor。一个简单的例子是:

// 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有效时,客户端上的用户才会有一个文档,这由在服务器上运行的特权函数someServerMethodThatValidatesUserId确定。

(如果您想要手动管理发送到客户端的特定文档,而不是依赖Mongo查询,则this.set在您的发布功能中可用。但我不认为这样的事情是必要的此处。)

答案 1 :(得分:1)

这是Meteor认证之前的一个老问题。 TL; DR答案是:

meteor remove autopublish

然后,manage your own collections, publications and subscriptions