【问题标题】:Getting values from the server从服务器获取值
【发布时间】:2012-05-03 03:56:32
【问题描述】:

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

例如,假设我想知道当前是否有用户登录。当用户第一次登录时,我在Session 和cookie 中设置了该用户的数据库ID。目前,应用程序说如果!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 模型也可能不适合这个,我还缺少另一种方式。任何建议表示赞赏!

【问题讨论】:

  • 查看其中一位 Meteor 开发人员的回答:stackoverflow.com/questions/10115042/… 它展示了如何禁用允许客户端和服务器执行任意 mongo 命令的默认“训练轮”。然后,您可以通过 Meteor.methods 和 Meteor.publish 仅向客户端公开您想要的内容。当 Meteor 授权包发布时,这将被简化。

标签: meteor


【解决方案1】:

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

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

// 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});
});

然后在客户端上,一旦您拥有user_id,就订阅my-user 集:

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

现在,当且仅当 user_id 有效时,您将在客户端的用户中拥有一个文档,这由运行在服务器上的特权函数 someServerMethodThatValidatesUserId 确定。

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

【讨论】:

  • 这似乎会与我的客户端代码中想要访问我的整个用户集合的其他部分产生冲突,不是吗?
  • 这还不错,即使用户决定更改 'user_id' 的会话值,服务器仍然会验证。
【解决方案2】:

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

meteor remove autopublish

那么,manage your own collections, publications and subscriptions

【讨论】:

  • 感谢更新,确实这似乎是古老的历史
猜你喜欢
  • 1970-01-01
  • 2018-11-18
  • 2013-05-19
  • 2021-06-06
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多