在todos示例(0.9.4)中,除非您已登录,否则默认情况下所有列表都是公共/共享的。如果您未登录,如何将其修改为仅显示您创建的列表? / p>
我想象有一个与每个列表一起保存的持久性服务器端会话ID,可以像这样使用:
Meteor.publish('publicLists', function() {
return Lists.find({sessId: Session.id(), userId: {$exists: false}});
});
答案 0 :(得分:0)
您可以在客户端设置会话并通过它订阅:
//Client Side
Session.set("listsCreatedByUnknownUserId", someId);
每当新客户端开始使用该应用程序时,可以生成someId,如果他们要登录,则替换为最终的userID,反之亦然。
if (Meteor.isClient) {
Meteor.startup ( function () {
var someId = //generate unique ID for unknown client
Session.set("listsCreatedByUnknownUserId", someId");
}
//Now Subscribe using that ID
Meteor.subscribe("lists",Session.get("listsCreatedByUnknownUserId"));
}
现在,您的列表将从该会话someId
订阅。如果您的用户最终要登录,那么您只需通过一个简单的Lists
将unknownUserId
下创建的所有Lists.update
转移到登录用户ID即可。我会发布列表:
Meteor.publish('publicLists', function(someId) {
return Lists.find({creatorId: someId});
});
现在在任何客户端列表中插入您只需从插入的Session中获取该ID:
Lists.insert({foo:foo, creatorId: Session.get("listsCreatedByUnknownUserId")});
答案 1 :(得分:0)
最好的方法是禁止公开使用该应用程序: 登录是必需的,为此在路由器上添加过滤器
var filters = {
isLoggedIn: function() {
console.info('filter isLoggedIn', Session.get('selectedSearch'));
if (!(Meteor.loggingIn() || Meteor.user())) {
this.stop();
Router.go('join');
}
}
}
Router.onBeforeAction(filters.isLoggedIn, {only: ['listsShow']})
删除不安全的软件包并在集合上添加规则,以管理授权和更改文档以在插入时添加ownerId
var collectionsCheck = {
"onlyConnected": function(userId, doc) {
if (!userId) return false;
doc.ownerId = userId;
return true;
},
"onlyOwner": function(userId, doc) {
if (userId == doc.ownerId) return true;
return false;
}
};
Lists.insert({
"insert": collectionsCheck.onlyConnected,
"update": function() {
return false;
},
"remove": collectionsCheck.onlyOwner
});
Todos.allow({
"insert": collectionsCheck.onlyConnected,
"update": function(userId, doc, fieldNames, modifier) {
if (!userId) return false;
if (!doc.userIds) doc.userIds = [];
if (!_.contains(doc.userIds, userId)) doc.userIds.push(userId);
return true;
},
"remove": collectionsCheck.onlyOwner
});
最后,在订阅上添加发布:
Meteor.publish('publicLists', function() {
return Lists.find({userId: {$exists: false}});
});
Meteor.publish('privateLists', function() {
if (this.userId) {
return Lists.find({ownerId: this.userId});
} else {
this.ready();
}
});
Meteor.publish('todos', function(listId) {
check(listId, String);
return Todos.find({listId: listId});
});
应该没问题,但我没有检查代码因为它只是一个样本给你。