2011-04-27 23 views
41

Po pierwsze, czy strona statyczna wyświetlana w aplikacji powinna być stroną logowania?backbone.js - obsługa, jeśli użytkownik jest zalogowany lub nie

Po drugie, mój kod po stronie serwera jest w porządku (nie da żadnych danych, których użytkownik nie powinien widzieć). Ale w jaki sposób mogę poinformować moją aplikację, że jeśli użytkownik nie jest zalogowany, aby powrócić do formularza logowania?

Odpowiedz

14

Mam wywołanie zaplecza, że ​​mój kod po stronie klienta, że ​​moja strona statyczna (index.php) sprawia, że ​​sprawdzanie, czy bieżący użytkownik jest zalogowany. Załóżmy, że masz wywołanie zaplecza na api/auth/logged_in, który zwraca kod stanu HTTP 200 jeśli użytkownik jest zalogowany lub 400 inaczej (przy użyciu sesji opartych o ciasteczka):

appController.checkUser(function(isLoggedIn){ 
    if(!isLoggedIn) { 
     window.location.hash = "login";  
    } 

    Backbone.history.start(); 
}); 

... 

window.AppController = Backbone.Controller.extend({ 

    checkUser: function(callback) { 
    var that = this; 

    $.ajax("api/auth/logged_in", { 
     type: "GET", 
     dataType: "json", 
     success: function() { 
     return callback(true); 
     }, 
     error: function() { 
     return callback(false); 
     } 
    }); 
    } 
}); 
+0

Jak można sprawdzić, zanim jakiekolwiek dane nigdy nie otrzymał? Tak więc za każdym razem, gdy aplikacja wyszukuje dane, sprawdza, czy są zalogowani. Jeśli nie, przechodzi na stronę logowania. – Matthew

+9

Jeśli chcesz sprawdzić każde wywołanie do zaplecza, powinieneś zintegrować to z kodem zaplecza. Np. Jeśli użytkownik nie jest uwierzytelniony dla * jakiegokolwiek * połączenia, możesz zwrócić '401 Nieautoryzowane 'z twojego serwera lub coś, co możesz złapać po stronie klienta. W ten sposób nie trzeba osobnego połączenia, aby sprawdzić autoryzację przed każdym żądaniem danych. W tym przypadku prawdopodobnie musiałbyś zastąpić metodę 'Backbone.sync', aby wykryć, że' 401 Nieautoryzowane' i wyemitować zdarzenie, którego możesz użyć do wykrycia, czy wywołanie zaplecza było nieautoryzowane. – Sam

+1

Przeczytaj proszę ↓ – user2398029

69

używam pojęcia sesji kontrolować stan logowania użytkownika.

Mam SessionModel i SessionCollection takiego:

SessionModel = Backbone.Model.extend({ 
    defaults: { 
     sessionId: "", 
     userName: "", 
     password: "", 
     userId: "" 
    }, 

    isAuthorized: function(){ 
     return Boolean(this.get("sessionId")); 
    } 

}); 

w App początku I zainicjować dostępne globalnie zmienną activeSession. Na początku ta sesja jest nieautoryzowana i wszelkie widoki wiążące się z tą instancją modelu mogą być odpowiednio renderowane. Podczas próby logowania, najpierw się wyloguję, unieważniając sesję.

logout = function(){ 
    window.activeSession.id = ""; 
    window.activeSession.clear(); 
} 

To spowoduje żadnych widoki, które słuchają tej activeSession i położyłem MAINVIEW w tryb logowania, gdzie będzie wystawiony monit logowania. I wtedy uzyskać nazwę użytkownika i hasło od użytkownika i ustawić je na activeSession tak:

login = function(userName, password){ 
    window.activeSession.set(
     { 
      userName: userName, 
      password: password 
     },{ 
      silent:true 
     } 
    ); 
    window.activeSession.save(); 
} 

To spowoduje aktualizację do serwera poprzez backbone.sync. Na serwerze mam ustawioną akcję akcji POST sesji, aby sprawdzić nazwę użytkownika i hasło. Jeśli jest prawidłowy, wypełnia dane użytkownika w sesji, ustawia unikalny identyfikator sesji i usuwa hasło, a następnie odsyła wynik.

Moja strona główna.sync jest następnie konfigurowana, aby dodać identyfikator sesji window.activeSession do dowolnego wychodzącego żądania do serwera. Jeśli identyfikator sesji jest nieprawidłowy na serwerze, odsyła on HTTP 401, który wyzwala wylogowanie(), co prowadzi do wyświetlenia znaku zachęty logowania.

Nie jesteśmy jeszcze całkiem skończeni, aby to wdrożyć, więc mogą występować błędy w logice, ale w zasadzie tak do niego podchodzimy. Ponadto, powyższy kod nie jest naszym rzeczywistym kodem, ponieważ zawiera nieco więcej logiki obsługi, ale jest to istotna kwestia.

+0

Właściwie to zmieniłem nieco zachowanie. Wiem, tworzyć nowe sesje przez sessionCollection.create(), a następnie wystrzelić globalnie dostępną wiadomość loginSuccess, którą każdy widok może odsłuchać. –

+0

Twoja metoda brzmi świetnie. Czy jest szansa, że ​​podzielisz się istotą zaktualizowanego kodu? :) – dbau

+0

Niestety odeszliśmy od tego rozwiązania do oddzielnego mechanizmu uwierzytelniania (na razie opartego na plikach cookie) ze względu na problemy z backendem (chcieliśmy użyć gotowego systemu uwierzytelniania na zapleczu). –

-14

myślę, że należy to zrobić server-side tylko ... Istnieje wiele szanse na to hacked urządzenie i chyba masz jakieś niesamowite api reaguje na nią

+8

Powinieneś zrobić to po stronie serwera _ dobrze_, ale nie ma nic złego w wykryciu stanu logowania na kliencie, pod warunkiem, że nie jesteś od niego zależny. –

2

myślę, że powinien nie tylko kontrolować html wyświetlacz, ale także kontrolować wyświetlane dane. Ponieważ użytkownik może używać firefox do zmiany kodu javascript.

Aby uzyskać szczegółowe informacje, należy podać użytkownikowi token po jego zalogowaniu i za każdym razem, gdy odwiedza on element na stronie, taki jak siatka danych lub drzewo, lub coś w tym stylu, strona musi pobrać te dane (być może w jsonie) z Twojego serwisu internetowego, a usługa ta sprawdzi token, jeśli token jest niepoprawny lub przeszły, nie powinieneś podawać danych użytkownika, powinieneś dać komunikat o błędzie. Aby użytkownik nie mógł złamać zabezpieczeń, nawet jeśli użyje firebug do zmiany kodu js.

To może ci pomóc.

Powiązane problemy