假设我不希望我的客户端访问集合,但我确实希望我的客户能够询问有关该集合中对象的某些问题。我怎么做到这一点?
例如,假设我想知道当前是否有用户登录。当用户首次登录时,我会在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模型也不适合这种情况,还有另一种方法,我错过了。任何建议表示赞赏!
答案 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。