【问题标题】:meteor: identify client and send data to this specific client - creating block-element on other clients流星:识别客户端并将数据发送到此特定客户端 - 在其他客户端上创建块元素
【发布时间】:2016-03-15 01:27:46
【问题描述】:

我的流星应用程序必须由同一用户在多台 PC 上使用,但我必须防止同时使用该应用程序。问题是,用户会频繁更换工作场所,因此每次用户更换 PC 时登录和注销并不是一个好主意。我想到了使用临时注销/阻止屏幕:

示例:有五台 PC。用户已在所有五台 PC 上登录该应用程序。现在他想在 PC 1 上工作:在所有其他四台 PC 上,应用程序将通过显示透明覆盖暂时被阻止。如果他要去 PC 2,他可以通过键入一个小的 PIN 来移除覆盖层(这比完全登录要快),然后他可以在这台 PC 上工作。

PC 1 将同时被屏蔽。

叠加层可能如下所示:

<div id="overlay" class="{{tempLogout}}">
    <input type="text" id="pin">
</div>

#overlay {
    display: none;
    position: fixed;
    width: 100%;
    height: 100%;
    background-color: rgba(0,0,0,0.8);
}

#overlay.logout {
    display: block !important;
}

在我的助手中,我会这样做:

Template.anything.helper({
    tempLogout: function() {
        return (Session.get('currentClient') == clientID) ? '' : 'logout';
    }
});

现在,如果 Session 变量为 false,则会显示叠加层。

我的问题是如何让不同的客户端知道用户当前在哪个客户端上工作。而且这些信息必须是被动的。

所以在我的概念中,我将为每台 PC 创建一个随机 ID(也许已经存在任何识别每个客户端的选项??)并将此 ID 保存到 body-element 上的数据属性中:

$('body').attr('data-id', Random.id());

通过输入正确的 PIN,此 ID 将保存到用户集合中:

var clientID = $('body').attr('data-id');
Session.set('currentClient', clientID);
Users.update({ _id: Meteor.id() }, { $set: { 'currentClient': clientID } });

通过将 Session 变量设置为新的客户端 ID,所有其他客户端将被阻止,因为 Session 变量是反应性的。在这里我不知道我必须使用哪个存储:Session 或 Collection。

也许有人有更聪明的想法来完成这项工作。特别是我认为将clientID存储在数据属性中有点...... hacky? 以及如何将客户端 ID 获取到帮助程序中 - 因为必须检查 currentClient 是否相同,然后是 clientID...

【问题讨论】:

    标签: javascript mongodb session meteor temporary


    【解决方案1】:

    我认为如果不使用 Meteor.logoutOtherClients() (http://docs.meteor.com/#/full/meteor_logoutotherclients),这将非常困难。如果您使用 oauth 之类的登录机制,登录部分将是一个简单的按钮单击以返回应用程序,这实际上比 pin 简单得多。

    【讨论】:

    • 我对@9​​87654323@一无所知。你能给我更多的信息吗?
    • 这很简单。只需添加 accounts-google 或 accounts-facebook 包并使用 google 开发人员控制台或 facebook 开发人员设置 oauth 凭据。它让用户只需单击一下即可使用他们的 google 或 facebook 帐户登录到您的应用程序。 themeteorchef.com/recipes/roll-your-own-authentication
    • 很遗憾,这不是此应用程序的选项。
    【解决方案2】:

    我认为你的概念应该可行。 您应该使用 Meteor.user() 这样您就不必订阅任何内容(在您的示例中,您使用通用集合用户)。

    您应该使用全局 clientID 并避免将其插入 html。 比如:

      //on client
        clientID = Random.id(); //in Meteor a variable without var is global
    
    
    Template.anything.helper({
        tempLogout: function() {
            return Meteor.user().profile.clientID == clientID ? '' : 'logout';
        }
    });
    

    当插针正确时:

       Meteor.users.update({_id: Meteor.userId()}, {$set: {'profile.clientID':clientID}});
    

    如果您有多个要启用/禁用的模板,则必须使用 Session 或全局模板助手。

    【讨论】:

    • clientID = Random.id(); 将针对一个客户端进行修复,因为它会在重新加载时更改?
    • 任何时候你重新加载应用程序都会改变,但我认为这不是问题。每次有人登录时,您都会显示 pin 表单。我认为这是尝试的唯一解决方案,但我看不出它不应该起作用的任何原因。
    猜你喜欢
    • 1970-01-01
    • 2013-02-27
    • 2019-06-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多