2015-10-06 14 views
7

E 'possibile verificare un cliente unico in meteora? Sembra un po 'strano. Lasciatemi spiegare:Meteor: è possibile verificare se l'applicazione ha già un'istanza aperta su un altro computer?

Voglio consentire alla mia app meteo di funzionare su un solo computer contemporaneamente. Ma non posso usare l'IP per il controllo, dato che ci sono anche computer in una stessa rete, quindi ci sarebbe lo stesso IP per il server esterno.

Se qualcuno apre l'app su un secondo computer, tutte le altre istanze dell'applicazione (aperte) su un altro computer devono essere disconnesse (o qualcosa del genere).

È possibile questa tecnica in meteora?

Aggiornamento

Si prega di notare che io non voglio bloccare un secondo login, ma voglio il logout su tutti gli altri dispositivi se l'utente fa un login.

+0

Impostare un flag nel database e indirizzare a una vista: "Visualizza attualmente non disponibile per favore tornare più tardi?" – MichelH

+0

Potresti per favore darmi un rapido esempio perché non capisco completamente cosa intendi impostando un flag :-(E sì, il routing (usando IronRouter) a una vista sarebbe esattamente quello che voglio fare. sul "check" ... – user3142695

+0

Scrivi una funzione semplice su if (Meteor.isClient). Istanziare una raccolta lato server e riempirla con il client sul sito web è uguale a vero. Finché questo flag è impostato non instradare altrove diverso da: visualizzazione non disponibile, si prega di tornare più tardi. Nel caso in cui sia falso, percorso fino al punto in cui si desidera che il tuo utente. – MichelH

risposta

1

meteora ha in funzione incorporata per questo

prega Controllare

Meteor.logoutOtherClients([callback])

Meteor Documentation

+0

Questo non disconnette tutti gli altri utenti, solo altri dispositivi registrati come lo stesso utente – challett

0

È possibile utilizzare l'indirizzo Mac. Anche se si trovano nella stessa rete, hanno diversi indirizzi MAC + dato che hai utenti e account, puoi avere un posto in qualche posto online, impostare l'utente quando qualcuno accede e consentire ad altri utenti di usare l'app solo se non è stato effettuato l'accesso. Per maggiore chiarezza, inserire un input vuoto da qualche parte online. Ogni volta che qualcuno accede, imposta il testo di input con le credenziali dell'utente o qualcos'altro a seconda di te. Quando un altro utente prova a usarlo, fa controllare se l'input è vuoto. Se no significa che è occupato.

Ancora credo che la soluzione di indirizzo Mac sia la più semplice e la migliore.

Edit: Questo è come ogni connessioni sembra sul router

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 

Ci sono tante soluzioni qui, date, indirizzi MAC, i tempi, l'IPS

+0

Hmm. Sembra interessante, ma il mio problema è come disconnettere tutti gli altri dispositivi. Prendendo il tuo esempio per l'accesso alle 20:10:51 tutti gli altri dispositivi in ​​cui l'utente è già connesso dovrebbero essere disconnessi ... – user3142695

+0

Ho difficoltà a seguirti ... Quando esegui il login all'app, assicurati che qualcuno sia già registrato e impedito. – user2530266

0

Ci sono alcuni modi per ottenere questo risultato.

ad esempio, consente utilizzare il Mizzao user status package

E poi Diciamo che avere qualcosa di simile

"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"); 
    } 
} 

Ora un'altra possibile soluzione.

Diciamo che questa raccolta è solo su server.

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

ora utilizzare la funzione

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

Meteor.loggingIn(callback); 

Meteor.loggingIn() Poi sul server

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"}; 
    } 
    } 
}); 

Ora sul vostro qualcosa di evento di accesso come questo.

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

NOTA questo è il codice concettuale, tanto per dare e l'idea, e spero che si ottiene l'idea

Buona fortuna = D

+0

Grazie per la tua idea, ma ne ho bisogno proprio il contrario: non voglio bloccare un secondo login, ma voglio fare un logout sugli altri schermi, se l'utente sta effettuando l'accesso su un altro pc. – user3142695

1

EDIT: forse ho frainteso il domanda, questo è per assicurarsi che l'utente abbia effettuato l'accesso solo su un dispositivo alla volta. Non solo un utente alla volta.

non solo è possibile, è costruito in. Controlla la docs

chiamata Meteor.logoutOtherClients() su login logout altri clienti registrati come lo stesso utente.

/client/lib/hooks.js

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

    }) 
} 
1

È necessario utilizzare il callback Server validateLoginAttempt, ed eliminare tutti i loginTokens da Meteor.users prima di accedere un utente.

Esempio richiede pacchetti accounts-ui e 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 
    }); 
} 
Problemi correlati