I want to restrict logged-in users to only have one active session, i.e. if the user logs in with a new sessionid, the old session should be terminated. I found a lot of help on SO already: here and here
I implemented the middleware solution, with a bit of extra checking...
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
So far, so good... on the Django dev server (manage.py runserver) everything works properly, it kicks the old session...
...but when using Apache ( with mod_wsgi), it doesn't work!
I've tried to find any information about this, but no luck so far...
The closest I have found is this, but it is kind of the 'opposite' problem...
Any help would be much appreciated.
Edit: I added a debug print before deleting the Session... here's a snippet from Apache's error.log:
[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
the first two lies are from when I entered with the first session (Firefox)
the last two are from when I entered with the second session (Chromium)
... it turns out that the old Session record does not get deleted... ???
I'm running vs. the exact same PostgreSQL instance as I did with the devserver...
Edit2: It turned out that my code was buggy... it failed when the new Session_key wasn't found in Session...
here's the fixed code... the try..except is now in the correct place
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()