我想限制已登录的用户仅拥有一个活动会话,即如果用户使用新的sessionid登录,则旧的会话应该被终止。
我已经在stackoverflow上找到了很多帮助:
这里和这里
我实现了中间件解决方案,并进行了一些额外的检查...
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
目前为止,在Django开发服务器(manage.py runserver)上一切都很好,一切都正常工作,它会清除旧的会话......
但是当使用Apache(带有mod_wsgi)时,它不起作用!
我尝试找到有关此问题的任何信息,但迄今为止没有运气...
我找到的最接近的是这个问题,但它是相反的问题...
非常感谢任何帮助。
编辑:我在删除Session之前添加了一个调试打印语句......下面是来自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
前两个错误是我使用第一个会话(Firefox)时出现的。
后两个错误是我使用第二个会话(Chromium)时出现的。
... 结果发现旧的会话记录并未被删除... ???
我正在与与devserver相同的PostgreSQL实例进行比较...
编辑2:结果我的代码有漏洞... 当新的Session_key在Session中找不到时,它失败了...
这是已经修复的代码... 现在try..except在正确的位置上了
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()
Session
删除之前加上一个打印/日志调用,你能看到它在mod_wsgi
下执行吗? - AdamKGuser.get_profile()
是做什么用的? - gdvalderrama