2011-04-27 8 views
41

En primer lugar, ¿la página estática que se sirve para la aplicación debe ser la página de inicio de sesión?backbone.js - manejo si un usuario está conectado o no

En segundo lugar, mi código del lado del servidor está bien (no proporcionará ningún dato que el usuario no pueda ver). Pero, ¿cómo hago saber a mi aplicación que si el usuario no está conectado, para volver a un formulario de inicio de sesión?

Respuesta

14

Tengo una llamada de fondo que mi código del lado del cliente que mi página estática (index.php) hace para comprobar si el usuario actual está conectado. Digamos que tiene una llamada back-end al api/auth/logged_in que devuelve el código de estado HTTP 200 si el usuario está conectado o 400 otra manera (usando sesiones basadas en cookies):

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

¿Cómo comprobar antes de los datos es cada vez recibida? De modo que cada vez que la aplicación realiza una llamada de datos, verifica si están conectados. De lo contrario, va a la página de inicio de sesión. – Matthew

+9

Si desea verificar cada llamada al back-end, debe integrar eso con su código back-end. Por ejemplo, si el usuario no está autenticado para * cualquier * llamada, puede devolver un '401 no autorizado' de su back-end o algo que pueda atrapar en el lado del cliente. De esta manera, no tiene que hacer una llamada por separado para verificar la autorización antes de cada solicitud de datos. En este caso, es probable que tenga que anular el método 'Backbone.sync' para capturar' 401 Desautorizado' y emitir algún evento que pueda usar para detectar si una llamada de back-end no fue autorizada. – Sam

+1

Lee abajo por favor ↓ – user2398029

69

que utilizan el concepto de sesión para controlar el estado de inicio de sesión de usuario.

Tengo un SessionModel y SessionCollection así:

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

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

}); 

En la puesta en aplicación, que inicializar una variable disponible a nivel mundial, activeSession. Al inicio, esta sesión no está autorizada y cualquier vista que se vincule a esta instancia de modelo se puede representar en consecuencia. En el intento de inicio de sesión, primero salgo de sesión al invalidar la sesión.

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

Esto hará que los puntos de vista que escuchan la activeSession y se puso a mi MAINVIEW en el modo de inicio de sesión donde se pondrá un aviso de la conexión. Entonces consigo el nombre y contraseña del usuario y ponerlos en el activeSession así:

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

Esto desencadenará una actualización al servidor a través Backbone.sync. En el servidor, tengo la configuración de acción POST de recurso de sesión para que compruebe el nombre de usuario y la contraseña. Si es válido, rellena los detalles del usuario en la sesión, establece una identificación de sesión única y elimina la contraseña y luego devuelve el resultado.

Mi backbone.sync se configura para agregar el sessionId de window.activeSession a cualquier solicitud de salida al servidor. Si el ID de la sesión no es válido en el servidor, devuelve un HTTP 401, que desencadena un cierre de sesión(), lo que lleva a que se muestre el aviso de inicio de sesión.

Todavía no hemos terminado de implementar esto, por lo que puede haber errores en la lógica, pero básicamente, así es como lo abordamos. Además, el código anterior no es nuestro código real, ya que contiene un poco más de lógica de manejo, pero es lo esencial.

+0

De hecho, cambié el comportamiento un poco. Sé crear nuevas sesiones por sessionCollection.create() y luego iniciar un mensaje de login de acceso disponible a nivel mundial que cualquier vista puede escuchar. –

+0

Su método suena genial. ¿Alguna posibilidad de que puedas compartir una parte del código actualizado? :) – dbau

+0

Desafortunadamente nos alejamos de esta solución a un mecanismo de autenticación separado (basado en cookies por ahora) debido a problemas en el backend (queríamos usar un sistema de autenticación listo para usar en el backend) –

-14

creo que debe hacer este servidor solo por una cara ... Hay muchas posibilidades de conseguir que hackeado unidad y menos que tenga algún tipo de API increíble responder a ella

+8

Debería hacerlo del lado del servidor _así_, pero no hay nada de malo en detectar el estado de inicio de sesión en el cliente siempre que no dependa de él. –

2

creo que no sólo debe controlar el html mostrar pero también controlar los datos de visualización. Porque el usuario puede usar Firefox para cambiar su código de JavaScript.

Para más detalles, debe darle al usuario un token después de que inicie sesión y cada vez que visite su componente en una página como cuadrícula de datos o árbol o algo así, la página debe obtener estos datos (tal vez en json) desde su servicio web, y el servicio web comprobará este token; si el token es incorrecto o está pasado debido a que no debe proporcionar los datos del usuario, debe dar un mensaje de error. Para que el usuario no pueda descifrar su seguridad incluso si usa firebug para cambiar el código js.

Eso podría serle útil.

Cuestiones relacionadas