Django如何防止多个用户使用相同的凭据登录

时间:2011-12-07 00:20:29

标签: django django-authentication

我正在使用django auth模块开发一个Django应用程序,并希望使用相同的用户名和密码阻止多次登录。

它应该阻止使用相同用户名和密码在不同计算机上进行多次登录。我如何在Django中实现这一目标?

我们必须牢记以下事项:

  1. 如果用户在未注销的情况下关闭浏览器
  2. 如果会话超时

3 个答案:

答案 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):
...