11

假设我不希望我的客户有权访问某个集合,但我确实希望我的客户能够就该集合中的对象提出某些问题。我将如何实现这一目标?

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

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

这是我希望看到的设置方式:

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

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

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

或者也许 pub/sub 模型也不适合这个,我还缺少另一种方式。任何建议表示赞赏!

4

2 回答 2

6

听起来您正试图限制客户端在通过身份验证之前访问数据。这是一种方法:

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的特权函数确定。someServerMethodThatValidatesUserId

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

于 2012-04-22T04:51:53.160 回答
1

这是 Meteor 进行身份验证之前的一个古老问题。TL;DR 的答案是:

meteor remove autopublish

然后,管理您自己的收藏、出版物和订阅

于 2014-03-06T11:57:27.573 回答