Quiero restringir que los usuarios conectados solo tengan una sesión activa, es decir, si el usuario inicia sesión con un nuevo sessionid, la sesión anterior debe finalizar. me encontré con un montón de ayuda en ya SO: here y herePermitir solo una sola sesión activa por usuario en la aplicación Django
he implementado la solución de middleware, con un poco de comprobación adicional ...
class OnlyOneUserMiddleware(object):
"""
Middleware to ensure that a logged-in user only has one session active.
Will kick out any previous session.
"""
def process_request(self, request):
if request.user.is_authenticated():
try:
cur_session_key = request.user.get_profile().session_key
if cur_session_key and cur_session_key != request.session.session_key:
# Default handling... kick the old session...
Session.objects.get(session_key=cur_session_key).delete()
if not cur_session_key or cur_session_key != request.session.session_key:
p = request.user.get_profile()
p.session_key = request.session.session_key
p.save()
except ObjectDoesNotExist:
pass
Hasta ahora, todo bien ... en el servidor de desarrollo de Django (manage.py runserver) funciona todo correctamente, activa la sesión anterior ...
... pero cuando se usa Apache (con mod_wsgi), ¡no funciona!
He tratado de encontrar ninguna información sobre esto, pero sin suerte hasta ahora ...
Lo más cerca que he encontrado es this, pero es tipo de problema 'opuesto' ...
Cualquier ayuda sería muy apreciada.
Edit: agregó una impresión de depuración antes de eliminar la Sesión ... He aquí un fragmento de error.log de Apache:
[Fri Jan 20 09:56:50 2012] [error] old key = f42885ccb7f33b6afcb2c18fca14f44a
[Fri Jan 20 09:56:50 2012] [error] new key = ce4cfb672e6025edb8ffcd0cf2b4b8d1
[Fri Jan 20 09:57:14 2012] [error] old key = f42885ccb7f33b6afcb2c18fca14f44a
[Fri Jan 20 09:57:14 2012] [error] new key = 0815c56241ac21cf4b14b326f0aa7e24
las dos primeras mentiras son de cuando entré con la primera sesión (Firefox)
los dos últimos son de cuando entré con la segunda sesión (cromo)
... resulta que el registro de sesión de edad no se borran ... ???
estoy corriendo contra el exacto la misma instancia PostgreSQL como lo hice con el devserver ...
Edit2: Resultó que era mi código con errores ... que falló cuando el nuevo session_key no era en la sesión nº ...
aquí está el código fijo ... la try..except está ahora en el lugar correcto
class OnlyOneUserMiddleware(object):
"""
Middleware to ensure that a logged-in user only has one session active.
Will kick out any previous session.
"""
def process_request(self, request):
if request.user.is_authenticated():
cur_session_key = request.user.get_profile().session_key
if cur_session_key and cur_session_key != request.session.session_key:
# Default handling... kick the old session...
try:
s = Session.objects.get(session_key=cur_session_key)
s.delete()
except ObjectDoesNotExist:
pass
if not cur_session_key or cur_session_key != request.session.session_key:
p = request.user.get_profile()
p.session_key = request.session.session_key
p.save()
Cuando dices "no funciona", ¿qué es exactamente lo que no funciona? ¿Todavía ves la sesión anterior en la base de datos? Si pone una llamada de impresión/registro justo antes de la eliminación de 'Session', ¿ve que se ejecuta bajo' mod_wsgi'? – AdamKG
@ AdamKG: ¡Gracias por apuntarme en la dirección correcta! –
Si el motor de sesión es cache_db, creo que también necesitamos eliminar sessionkey del caché manualmente, ¿verdad? – Wesley