【问题标题】:How do you securely log out and clear all subscriptions?您如何安全地注销并清除所有订阅?
【发布时间】:2015-03-28 10:53:05
【问题描述】:

我实现了自己的登录系统,因为我使用第三方 Web 服务根据企业身份验证系统对用户进行身份验证。因此,我构建了一个调用服务器方法的表单,以对身份验证系统进行 Web 服务调用,如果凭据有效,它会使用用户 ID 设置会话变量。这就是我更改模板以显示应用程序的主屏幕而不是登录屏幕的方式。工作正常。然后注销按钮只是将 userid 会话变量设置为 false,有效地隐藏了主应用程序屏幕并再次显示登录表单。

<body>
  {{#if loggedInUser}}
  {{> navbar}}
  {{> mainScreen}}
  {{else}}
  {{> customLogin}}
  {{/if}}
</body>

  Template.navbar.helpers({
    loggedInUser: function () {
      return Session.get('userName');
    }
  }); 

  'click #logoutButton': function () {
      Session.set("userName", false);
}

我发现,本地 minimongo 集合/订阅仍然在浏览器中,并且在用户注销后可以在控制台中访问。

我进行了一些搜索,但没有找到关于如何在客户端上正确清除(或停止?)这些订阅的具体解决方案。事实上,搜索“meteor 发布订阅”的前 3 次点击并没有提到注销时的停止或安全性。

关于 SO 的一个建议是保存订阅句柄......但我多次调用 subscribe,所以我似乎必须根据用户在使用期间触发的不同订阅数量来存储一个数组应用程序,然后在注销时通过它们在每个句柄上调用“停止”?

我希望有一种简单的方法可以停止所有订阅...当用户单击注销按钮时,为了安全起见,这似乎是合乎逻辑的事情。

谢谢!

【问题讨论】:

    标签: meteor


    【解决方案1】:

    你不能在集合上使用.stop()函数吗?

    var subscription = Meteor.subscribe("info");
    
    //on logout
    
    subscription.stop();
    

    根据docs

    停止() 取消订阅。这通常会导致服务器指示客户端从客户端缓存中删除订阅数据。


    更新:也许看看这个包:Subs Manager。他们似乎可以做你想做的事,特别是从他们的自述文件中:

    清除订阅

    在某些情况下,我们需要清除缓存的所有订阅。所以,这就是我们可以做到的。

    var subs = new SubsManager();
    
    // later in some other place
    subs.clear();
    

    【讨论】:

    • 我根据用户交互使用不同的参数多次调用 subscribe,因此,我将有多个订阅句柄来跟踪(在会话中?),然后在注销时对其进行迭代,叫停每一个...?我只是认为必须有更好的方法......我想知道内置的用户帐户系统(accounts-twitter 等)是否会自动停止......
    • 我想是的。我检查了我的一个快速应用程序(仅授予一个订阅),并在使用控制台Collection.find().fetch() 确认注销时将其清除。
    • subs.clear 工作得很好...我只是在注销操作时调用它并且所有订阅都被清除...现在如果会话中有类似的东西...即。 Session.clearAllSessionVariables()... 我习惯在 PHP 中这样做:php.net/manual/en/function.session-destroy.php
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 2021-09-26
    • 2017-12-19
    • 2014-04-02
    • 2021-08-02
    • 1970-01-01
    相关资源
    最近更新 更多