2015-10-06 2 views
7

Est-il possible de rechercher un client unique dans météore? Cela semble un peu étrange. Laissez-moi vous l'expliquer:Meteor: Possible de vérifier si l'application a déjà une instance ouverte sur un autre ordinateur?

Je souhaite que mon application météore ne fonctionne que sur un ordinateur en même temps. Mais je ne peux pas utiliser l'IP pour vérifier, car il y a aussi des ordinateurs dans un même réseau, donc il y aurait la même adresse IP pour le serveur externe.

Si quelqu'un ouvre l'application sur un second ordinateur, toutes les autres instances d'application (ouvertes) sur un autre ordinateur doivent être déconnectées (ou quelque chose comme ça).

Est-ce technique possible dans météore?

Mise à jour

S'il vous plaît noter que je ne veux pas bloquer une deuxième connexion, mais je veux fermer la session à tous les autres appareils si l'utilisateur de faire une connexion.

+0

Définir un indicateur dans la base de données et l'acheminer vers une vue: "Affichage actuellement indisponible s'il vous plaît revenir plus tard?" – MichelH

+0

Pourriez-vous s'il vous plaît me donner un exemple rapide car je ne comprends pas complètement ce que vous voulez dire en mettant un drapeau :-(Et oui, le routage (en utilisant IronRouter) à une vue serait exactement ce que je veux faire. sur le "chèque" ... – user3142695

+0

Ecris une fonction simple sur if (Meteor.isClient) Instancie une collection côté serveur et remplis-la avec Le client est sur le site web est égal à true Tant que ce drapeau est défini ne pas router ailleurs autre que: vue non disponible, s'il vous plaît revenir plus tard Dans le cas où il est faux, route vers le point où vous voulez que votre utilisateur soit – MichelH

Répondre

1

météore a en fonction intégrée pour cette

s'il vous plaît Vérifiez

Meteor.logoutOtherClients([callback])

Meteor Documentation

+0

Cela ne déconnecte pas tous les autres utilisateurs, seulement les autres appareils connectés en tant que même utilisateur – challett

0

Vous pouvez utiliser l'adresse Mac. Même s'ils sont dans le même réseau ils ont des adresses MAC différentes + puisque vous avez des utilisateurs et un compte, vous pouvez avoir une place quelque part en ligne, définir l'utilisateur quand quelqu'un se connecte et autoriser seulement l'autre utilisateur à utiliser l'application si un est connecté. Donc, pour le rendre plus clair, ayez une entrée vide quelque part en ligne. Chaque fois que quelqu'un se connecte, définissez le texte de l'entrée avec les informations d'identification de l'utilisateur ou autre chose selon vous. Lorsqu'un autre utilisateur essaie de l'utiliser, demandez-lui si l'entrée est vide. Si non, cela signifie qu'il est occupé.

Toujours je crois que la solution d'adresse Mac est la plus facile et la meilleure.

Edit: Voici comment toutes les connexions ressemble sur votre routeur

Wed, 14 Oct 2015 20:10:51 GMT IP=192.168.1.3 MAC=someaddershere 
Wed, 14 Oct 2015 19:13:58 GMT IP=192.168.1.4 MAC=someaddershere 
Wed, 14 Oct 2015 18:40:51 GMT IP=192.168.1.3 MAC=someaddershere 
Wed, 14 Oct 2015 18:40:47 GMT IP=192.168.1.3 MAC=someaddershere 
Wed, 14 Oct 2015 17:43:57 GMT IP=192.168.1.4 MAC=someaddershere 
Wed, 14 Oct 2015 17:10:43 GMT IP=192.168.1.3 MAC=someaddershere 

Il y a tellement de solutions ici, les dates, les adresses MAC, les temps, ips

+0

Hmm Cela semble intéressant, mais mon problème est comment déconnecter tous les autres appareils Prenant votre exemple pour la connexion à 20:10:51 tous les autres appareils où l'utilisateur est déjà connecté devrait être déconnecté ... – user3142695

+0

J'ai des difficultés à vous suivre ... Lorsque vous vous connectez à l'application, demandez-lui si quelqu'un est déjà connecté et empêchez-le. – user2530266

0

Il existe des moyens d'y parvenir.

Par exemple, permet d'utiliser le Mizzao user status package

Et laisse alors dire que vous avez quelque chose comme

"click .login":function(event, template){ 
var queryUsersOnline = Meteor.users.find({ "status.online": true }); 
if(query){ 
    //this means someone is online 
    alert("Sorry you can access now"); //or 
    Router.go("notAccessRoute"); 
    } 
} 

Maintenant, une autre solution possible.

Disons que vous avez cette collection seulement côté serveur.

//Server side only 
UserOnlineFlag = new Mongo.Collection('userOnlineFlag'); 

utilisent maintenant la fonction Meteor.loggingIn()

callback = function(){ 
if(Meteor.user()){ 
    Meteor.call('insertUserOnlineFlag'); 
} 
} 

Meteor.loggingIn(callback); 

ensuite sur le serveur

Meteor.methods({ 
insertUserOnlineFlag:function(){ 
    UserOnlineFlag.insert({someOneOnline:true}); 
}, 
checkUserStatus:function(){ 
    var query = UserOnlineFlag.findOne(); 
    if(query){ 
    throw new Meteor.Error(403, "Already someone online"); 
    }else{ 
    return {message:"welcome to the stackoverflow question app"}; 
    } 
    } 
}); 

maintenant sur votre événement de connexion quelque chose comme ça.

"click .login":function(event, template){ 
    Meteor.call("checkUserStatus",function(){ 
     if(error){ 
      console.log(error.message); 
     }else{ 
      console.log(result.message); 
     } 
    }) 
    } 

NOTE ce code est conceptuel, juste pour vous donner et idée, et j'espère que vous avez l'idée

Bonne chance = D

+0

Merci pour votre idée, mais j'en ai besoin dans l'autre sens: je ne veux pas bloquer une seconde connexion, mais je veux faire une déconnexion sur les autres écrans, si l'utilisateur se connecte sur un autre PC. – user3142695

1

EDIT: j'ai mal compris la question, c'est pour s'assurer que l'utilisateur est connecté uniquement à un périphérique à la fois. Pas seulement un utilisateur à la fois.

Non seulement il est possible, il est construit. Vérifiez le docs

Appel Meteor.logoutOtherClients() lors de la connexion à d'autres clients connectés dconnecter dans le même utilisateur.

/client/lib/hooks.js

Accounts.onLogin(function() { 
    Meteor.logoutOtherClients(function (error) { 
     if (error) { 
      //Error handling goes here 
      console.log(error) 
     } 

    }) 
} 
1

Vous devez utiliser la fonction de rappel du serveur validateLoginAttempt et supprimer tous les loginTokens de Meteor.users avant de vous connecter un utilisateur.

L'exemple nécessite les paquets accounts-ui et accounts-password.

./single.html:

<head> 
    <title>SingleUserSystem</title> 
</head> 

<body> 
    <h1>Welcome to Meteor!</h1> 
    {{> loginButtons}} 
    {{> main}} 
</body> 

<template name="main"> 
    <div id="name"> 
    {{#if currentUser}} 
     <h1>Logged In!</h1> 
     <h3>Another user logging in will log you out.</h3> 
    {{else}} 
     <h1>Logged Out!</h1> 
    {{/if}} 
    </div> 
</template> 

./single.js:

if (Meteor.isServer) { 
    // Server Callback on all login attempts 
    Accounts.validateLoginAttempt(function(attempt) { 
    if (!attempt.allowed) // If login attempt was going to fail we 
     return false;  // should not log out currently logged in user 

    // deleting loginTokens from Meteor.users collection logs out users 
    Meteor.users.update(
       {}, 
       {$set: { 'services.resume.loginTokens': [] } }, 
       {multi: true} 
      ); 

    return true; // return true to allow login to succeed 
    }); 
}