【发布时间】: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