是否可以在django应用程序中仅允许每个用户进行一次并发登录?如果是的话,你怎么做?
答案 0 :(得分:6)
我在我的应用程序中需要这个,所以我创建了一个django package,它现在在pypi上(pip install django-preventconcurrentlogins)。
该软件包基于peterdemin的代码段:https://gist.github.com/peterdemin/5829440
希望这有助于将来。
答案 1 :(得分:3)
这个问题主要回答here(stackoverflow.com)。
答案 2 :(得分:3)
您需要创建一些为每个用户保存session_key的模型 并创建中间件,为每个用户检查该模型中的会话密钥 - 如果它不等于request.session_key - 而不是删除该会话(=注销用户,仅允许当前用户)
#models.py
class Visitor(model.model):
user = models.OneToOneField(User)
session_key = models.CharField(null=True, blank=True)
#and you need to setup signal catching from User model - so for each User Visitor is created
#middleware.py
class OnlyOneUserMiddleware(object):
def process_request(self, request):
cur_session_key = request.user.visitor.session_key
if cur_session_key and cur_session_key != request.session.session_key:
Session.objects.get(session_key=cur_session_key).delete()
#the following can be optimized(do not save each time if value not changed)
request.user.visitor.session_key = request.session.session_key
request.user.visitor.save()
答案 3 :(得分:0)
我会假设你是指一次登录,而不是同时登录“。
我之前从未编写过Django应用程序。但是我在其他语言中使用的一种方法是将登录用户的会话ID存储在数据库的用户行中。
例如,如果数据库中有用户表,则添加字段“session_id”,然后在用户登录时将其设置为当前的session_id。在每个页面加载检查以查看其当前会话是否与users表中的session_id匹配。请记住,只要在应用程序中重新生成session_id,就需要更新数据库,以免它们被注销。
有些人在用户登录时,只是将所有用户详细信息存储到会话中,并且永远不会在新页面加载时重新调用数据库。所以对于一些人来说,这个“额外的”SQL查询似乎是错误的对我来说,我总是对每个页面加载进行新查询以重新验证用户并确保他们的帐户没有被删除/暂停,并确保他们的用户名/密码组合仍然相同。 (如果来自其他位置的人更改了密码或管理员怎么办?)