如何拥有持久的服务器端会话ID?

时间:2014-10-21 08:26:27

标签: meteor

在todos示例(0.9.4)中,除非您已登录,否则默认情况下所有列表都是公共/共享的。如果您未登录,如何将其修改为仅显示您创建的列表? / p>

我想象有一个与每个列表一起保存的持久性服务器端会话ID,可以像这样使用:

Meteor.publish('publicLists', function() {
  return Lists.find({sessId: Session.id(), userId: {$exists: false}});
});

2 个答案:

答案 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订阅。如果您的用户最终要登录,那么您只需通过一个简单的ListsunknownUserId下创建的所有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});
});

应该没问题,但我没有检查代码因为它只是一个样本给你。