2013-07-29 21 views
19

Czy istnieje sposób odebrania, gdy użytkownik wylogowuje się ze strony internetowej? Muszę zrobić porządek, kiedy to zrobią. Korzystanie z wbudowanych kont użytkowników meteor.js.Wywoływanie użytkownika meteor.js wylogowanie

Będę robić pewne sprawdzanie, używając go, więc potrzebuję rozwiązania, które nie może być wyzwalane w imieniu innych użytkowników po stronie klienta - najlepiej coś całkowicie po stronie serwera.

+0

Może to odpowiedzieć na pytanie: http://stackoverflow.com/questions/10257958/server-cleanup-after-a-client-disconnects –

+0

To bardzo blisko, ale robię chcesz się upewnić, że to tylko wtedy, gdy aktywnie się wylogują niestety. –

+0

może to pomóc: http://stackoverflow.com/questions/22900405/how-to-redirect-after-user-has-just-logged-in-lub-just-logged-out?answertab=votes#tab-top – dm76

Odpowiedz

7

Użyj pakietu user-status, który utworzyłem: https://github.com/mizzao/meteor-user-status. To jest całkowicie po stronie serwera.

Zobacz docs do użytku, ale można dołączyć obsługi zdarzeń do wylogowania sesji:

UserStatus.events.on "connectionLogout", (fields) -> 
    console.log(fields.userId + " with connection " + fields.connectionId + " logged out") 

Należy pamiętać, że użytkownik może zalogować się z różnych miejscach naraz z wielu sesji. Ten inteligentny pakiet wykrywa wszystkie z nich, a także czy użytkownik jest w ogóle online. Aby uzyskać więcej informacji lub zastosować własną metodę, sprawdź kod.

Obecnie pakiet nie rozróżnia zamknięcia okna przeglądarki i wylogowania i traktuje je jako takie same.

+0

Dzięki - zdecydowanie popatrzę! –

+1

to fajny pakiet. Każdy pomysł, w jaki sposób mogę zaimplementować wyzwalacze zdarzeń tylko przy logowaniu użytkownika/wylogowaniu z wyłączeniem zamknięcia przeglądarki/okna? każda wskazówka/kierunek byłaby niesamowita. dzięki @ andrew-mao –

+0

Jak mogę przekierować Użytkownika na określoną trasę, gdy użytkownik się wyloguje? – mfq

-2

Można użyć następującego Meteor.logout - http://docs.meteor.com/#meteor_logout

+2

Można wywoływać tylko po stronie klienta zgodnie z dokumentami. Loguje użytkownika bezpośrednio, co nie jest w tym przypadku pożądane. –

+2

Rzeczywiście - próbuję wykryć wylogowanie, a nie wyzwolić. –

+0

Meteor.logout posiada funkcję zwrotną Meteor.logout (function (err) {// do rzeczy tutaj}}) – MrE

9

Można użyć Deps.autorun do instalacji niestandardowej obsługi obserwacji Meteor.userId() reaktywnych zmian zmiennych.

Meteor.userId() (i Meteor.user()) są zmiennymi reaktywnymi zwracającymi odpowiednio aktualnie zalogowany identyfikator userId (null jeśli żaden) oraz odpowiedni dokument użytkownika (rekord) w zbiorze Meteor.users.

W konsekwencji można śledzić podpisywanie/wyprowadzanie aplikacji Meteor przez reakcję na modyfikację tych reaktywnych źródeł danych.

klienta/main.js:

var lastUser=null; 

Meteor.startup(function(){ 
    Deps.autorun(function(){ 
     var userId=Meteor.userId(); 
     if(userId){ 
      console.log(userId+" connected"); 
      // do something with Meteor.user() 
     } 
     else if(lastUser){ 
      console.log(lastUser._id+" disconnected"); 
      // can't use Meteor.user() anymore 
      // do something with lastUser (read-only !) 
      Meteor.call("userDisconnected",lastUser._id); 
     } 
     lastUser=Meteor.user(); 
    }); 
}); 

W tym próbki kodu, mam utworzenie pliku źródłowego zmiennej lokalnej (lastUser) śledzić ostatniego użytkownika, który był zalogowany w aplikacji. Następnie w Meteor.startup używam Deps.autorun do ustawienia kontekstu reaktywnego (kod, który zostanie ponownie wykonany, gdy nastąpi modyfikacja jednego z reaktywnych źródeł danych). Ten reaktywny kontekst śledzi odmianę Meteor.userId() i odpowiednio reaguje.

W kodzie dekonfiguracji nie można używać Meteor.user(), ale jeśli chcesz uzyskać dostęp do dokumentu ostatniego użytkownika, możesz użyć ostatniej zmiennejUser. Możesz wywołać metodę serwera z argumentem lastUser._id jako, jeśli chcesz zmodyfikować dokument po wylogowaniu.

server/server.js

Meteor.methods({ 
    userDisconnected:function(userId){ 
     check(userId,String); 
     var user=Meteor.users.findOne(userId); 
     // do something with user (read-write) 
    } 
}); 

Należy pamiętać jednak, że złośliwi klienci mogą wywołać tę metodę serwera z nikim userid, więc nie powinno się nic krytycznego, chyba że konfiguracja niektórych kod weryfikacyjny zrobić.

+0

Hey - w tym przypadku trzeba uniknąć groźnych klienci są w stanie nazwać, gdyż mają efekt wylogowania gracza z gry, co oczywiście nie pozwala ludziom robić sobie nawzajem. Masz pomysł, jak przygotować kod weryfikacyjny i powiązać go z konkretnym użytkownikiem? –

2

Odpowiedź udzielona przez @saimeunt wygląda dobrze, ale jest nieco puszysta w stosunku do potrzebnych.Zamiast tego poszedłem z bardzo prostego podejścia tak:

if (Meteor.isClient) { 
    Deps.autorun(function() { 
     if(!Meteor.userId()) 
     { 
      Session.set('store', null); 
     } 
    }); 
} 

to jednak wywołany podczas ładowania strony, jeśli użytkownik nie ma jeszcze zalogowany, co może być niepożądane. Więc można iść z czymś takim Zamiast:

if (Meteor.isClient) { 
    var userWasLoggedIn = false; 
    Deps.autorun(function (c) { 
     if(!Meteor.userId()) 
     { 
      if(userWasLoggedIn) 
      { 
       console.log('Clean up'); 
       Session.set('store', null); 
      } 
     } 
     else 
     { 
      userWasLoggedIn = true; 
     } 
    }); 
} 
+0

Wygląda na to, że byłoby miło umieścić rejestrację deps.autorun wewnątrz programu obsługi onLogin, w ten sposób rejestrujesz go tylko wtedy, gdy wiesz, że użytkownik się zalogował. Dobre rzeczy! – Derek

1

Żadne z rozwiązań pracował dla mnie, ponieważ wszyscy cierpieli od problemu nie jest w stanie odróżnić ręcznego wylogowania przez użytkownika vs. przeglądanej strony reload/blisko.

Jestem teraz dzieje z hack, ale przynajmniej działa (o ile nie przewiduje żadnych innych środków wylogowaniu niż domyślny rachunki-ui przycisków):

Template._loginButtons.events({ 
    'click #login-buttons-logout': function(ev) { 
     console.log("manual log out"); 
     // do stuff 
    } 
}); 
+0

Naprawdę interesujące. Czy potrzebujesz rozszerzenia aldeed: template-extension' lub podobnego w celu rozszerzenia/nadpisania funkcjonalności szablonów w pakiecie _accounts_? – Diego

+0

Dzięki, to też zrobiło to, czego potrzebowałem idealnie! – jremi

6

Mamy miał podobny, choć nie dokładny wymóg. Po wylogowaniu chcieliśmy trochę posprzątać klienta. Zrobiliśmy to przez porwanie Meteor.logout:

if (Meteor.isClient) { 
    var _logout = Meteor.logout; 
    Meteor.logout = function customLogout() { 
    // Do your thing here 
    _logout.apply(Meteor, arguments); 
    } 
} 
+0

To jest prosta i działa bardzo dobrze. Chciałem tylko przekierować użytkownika "wylogowanego" na stronę główną, co było podejściem łatwym + czystym. – Diego

Powiązane problemy