Se me ocurrió una nueva solución, que tiene un poco de sobrecarga, pero parece estar funcionando hasta ahora como un prototipo. Una suposición es que está en un entorno de sistema de honor para iniciar sesión, aunque esto podría adaptarse solicitando una contraseña cada vez que cambie de pestaña.
Use localStorage (o equivalente) y el evento de almacenamiento HTML5 para detectar cuándo una nueva pestaña del navegador ha cambiado qué usuario está activo. Cuando eso suceda, cree una superposición fantasma con un mensaje que indique que no puede usar la ventana actual (o deshabilite la ventana temporalmente, es posible que no desee que sea tan visible). Cuando la ventana recupera el foco, envíe un registro de solicitud AJAX el usuario vuelve a entrar.
Una advertencia para este enfoque: no puede hacer que se realicen llamadas AJAX normales (es decir, las que dependen de su sesión) en una ventana que no tiene el foco (por ejemplo, si tuvo una llamada después de un retraso), a menos que realiza manualmente una llamada de reinicio de sesión AJAX antes de eso. Entonces, realmente todo lo que necesita hacer es verificar primero su función AJAX para asegurarse de que localStorage.currently_logged_in_user_id === window.yourAppNameSpace.user_id, y si no, inicie sesión primero a través de AJAX.
Otra es la condición de la carrera: si puede cambiar las ventanas lo suficientemente rápido como para confundirlo, puede terminar con una secuencia relogin1-> relogin2-> ajax1-> ajax2, con ajax1 en la sesión incorrecta. Para evitar esto, inserte las solicitudes de inicio de sesión de AJAX en una matriz, y luego almacene y antes de emitir una nueva solicitud de inicio de sesión, cancele todas las solicitudes actuales.
Lo último que debes tener en cuenta es la actualización de ventanas. Si alguien actualiza la ventana mientras tiene una solicitud de inicio de sesión AJAX activa pero no completada, se actualizará en el nombre de la persona incorrecta. En este caso, puede usar el evento no estándar antes de la descarga para advertir al usuario sobre la posible confusión y pedirle que haga clic en Cancelar, mientras tanto, vuelva a emitir una solicitud de inicio de sesión AJAX. Entonces, la única forma en que pueden fallar es haciendo clic en Aceptar antes de que se complete la solicitud (o presionando accidentalmente enter / barra espaciadora, porque OK es, desafortunadamente para este caso, el predeterminado). Hay otras formas de manejar este caso, como detectar F5 y Ctrl + R / Alt + R presiona, lo que funcionará en la mayoría de los casos, pero podría verse frustrado por la reconfiguración de acceso directo del teclado del usuario o el uso alternativo del sistema operativo. Sin embargo, este es un caso marginal en realidad, y los peores escenarios nunca son tan malos: en una configuración de sistema de honor, se iniciaría sesión como la persona incorrecta (pero puede hacer obvio que este es el caso personalizando páginas con colores, estilos, nombres prominentemente mostrados, etc.); en una configuración de contraseña, la responsabilidad recae en la última persona que ingresó su contraseña para cerrar sesión o compartir su sesión, o si esta persona es realmente el usuario actual, entonces no hay infracción.
Pero al final tiene una aplicación de un usuario por pestaña que (con suerte) simplemente actúa como debería, sin tener que configurar necesariamente perfiles, usar IE o reescribir URL. Sin embargo, asegúrese de que sea obvio en cada pestaña quién ha iniciado sesión en esa pestaña en particular ...