我正在使用django auth模块开发一个Django应用程序,并希望使用相同的用户名和密码阻止多次登录。
它应该阻止使用相同用户名和密码在不同计算机上进行多次登录。我如何在Django中实现这一目标?
我们必须牢记以下事项:
答案 0 :(得分:3)
您可以尝试这样做,它会注销第一个用户并登录第二个用户。在app目录中添加middleware.py(与模型,视图等级别相同)并添加此代码。当同一个人使用多个设备时很有用。确保将其添加到您的中间件类:'myapp.middleware.UserRestrict',
Paint
答案 1 :(得分:2)
开箱即用,Django没有为您提供防止同一用户帐户的并发会话的方法,这不是一件容易的事。但是,这是另一个问题,提出了一些关于如何实现这一目标的建议:How can I detect multiple logins into a Django web application from different locations?
答案 2 :(得分:0)
我使用新模型,自定义装饰器和自定义登录页面来解决问题
1)我为用户创建了一个额外的模型,例如:
class SessionKey(models.Model):
user = models.OneToOneField(User,primary_key=True)
key = models.CharField(max_length=255)
2)我创建了自定义装饰器来检查会话密钥是否等于最后一个密钥。 我更改了原始源代码django decorators
from functools import wraps
from django.conf import settings
from django.utils.decorators import available_attrs
from django.contrib.auth.decorators import login_required
from django.shortcuts import resolve_url
from users.models import SessionKey #my additional model
def unique_login_required(view_func):
@wraps(view_func, assigned=available_attrs(view_func))
def _wrapped_view(request, *args, **kwargs):
r = False
...
#check session key is equal to last one
...
if r:
return view_func(request, *args, **kwargs)
else:
from django.contrib.auth.views import redirect_to_login
path = request.build_absolute_uri()
resolved_login_url = resolve_url(settings.LOGIN_URL)
return redirect_to_login(path,resolved_login_url)
return _wrapped_view
3)在自定义登录页面中,我更新了会话密钥。上次登录始终更新存储的会话密钥。
最后,在视图中,我调用了我的装饰者
from users.decorators import unique_login_required
@unique_login_required
def index(request):
...