假设我不希望我的客户端访问集合,但我希望我的客户能够询问有关该集合中对象的某些问题.我怎么做到这一点?
例如,假设我想知道当前是否有用户登录.当用户首次登录时,我将该用户的数据库ID设置Session在cookie中.目前,该应用程序说用户登录,如果!Session.equals("user_id", null),这当然是非常不安全因为现在我可以打开萤火虫说Session.set("user_id", "foo"),现在我已登录.
我不希望客户端此时有权访问Users集合.有权访问此集合的唯一客户端代码包含在自动执行功能中以保护它(我不确定这是否是在Meteor中执行安全性的正确方法,因此请随意推荐这些内容.以及).所以相反,我想调用一些服务器端代码并将其传递给会话中设置的id,让它告诉我这是否是一个有效的用户.
以下是我希望看到它的设置方式:
// client
function logged_in() {
return SomeServerMethodThatValidatesUserId(Session.get("user_id"));
}
Run Code Online (Sandbox Code Playgroud)
Meteor.methods似乎不符合要求,因为Meteor.call执行异步回调.pub/sub模型看起来更有前途,但从文档中,我不太清楚它是如何工作的.
它似乎建议我应该this.set从发布处理程序中调用,以便在客户端上设置一些值,但我无法弄清楚这些值可用的位置.
或者也许pub/sub模型也不适合这种情况,还有另一种方法,我错过了.任何建议表示赞赏!
听起来你试图限制客户端访问数据,直到它被验证为止.这是一种方法:
首先,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});
});
Run Code Online (Sandbox Code Playgroud)
然后在客户端上,my-user一旦掌握了user_id手机就订阅该套装:
// client-side
Meteor.subscribe('my-user', Session.get('user_id'));
Run Code Online (Sandbox Code Playgroud)
现在,只有当user_id有效时,您将在客户端上的Users中有一个文档,这由您someServerMethodThatValidatesUserId在服务器上运行的特权函数确定.
(this.set如果您想手动管理发送到客户端的特定文档,而不是依赖于Mongo查询,则可以在发布功能中使用.但我认为这里不需要这样的内容.)
这是 Meteor 没有认证之前的老问题了。TL;DR 的答案是:
meteor remove autopublish
Run Code Online (Sandbox Code Playgroud)
然后,管理您自己的收藏、出版物和订阅。
| 归档时间: |
|
| 查看次数: |
2619 次 |
| 最近记录: |