模仿Meteor中的用户

时间:2017-11-07 23:25:49

标签: meteor impersonation

我在Meteor应用程序中构建了impersonate方法,以便根据以下文章https://dweldon.silvrback.com/impersonating-a-user以其他用户身份登录。我还有内部通信集成(聊天小部件和用户跟踪)。我希望能够在客户端禁用内部通信小部件,以避免在我作为另一个用户(模仿)登录时从内部通信应用程序进行任何跟踪。当我为任何用户触发该模拟方法时,我正在考虑在用户配置文件上创建模拟布尔属性,并将其更新为true。问题是,当模拟方法完成时,我不知道如何将其设置为false。根据文章,您可以在手动刷新浏览器时停止模拟。你能帮助我,找到最好的方法吗?

1 个答案:

答案 0 :(得分:3)

我们可以分两部分来解决这个问题:

当我们开始冒充用户时,请跟踪谁冒充用户。让我们首先扩展教程中的impersonate方法:

Meteor.methods({
  impersonate: function(userId) {
    check(userId, String);

    if (!Meteor.users.findOne(userId))
      throw new Meteor.Error(404, 'User not found');
    if (!Meteor.user().isAdmin)
      throw new Meteor.Error(403, 'Permission denied');

    Meteor.users.update(this.userId, { $set: { 'profile.impersonating': userId }});
    this.setUserId(userId);

  }
});

接下来我们需要监听新的登录(这应该在浏览器刷新时发生)

Meteor.onLogin(() => {
  Meteor.call('clearImpersonation', (err, result) => {
    if (err) console.log('Error clearing impersonation: ',err);
  });
});

Meteor.methods({
  clearImpersonation(){
    const user = Meteor.users.findOne(this.userId);
    if (user && user.impersonating) Meteor.users.update(user._id,{ $unset: 'profile.impersonating' });
    return;
  }
});

现在,在您的用户界面中,您可以通过检查是否存在Meteor.user().profile.impersonating

来禁用内部通信