首页 > 解决方案 > 在 Django 应用程序的哪个部分对用户进行身份验证?

问题描述

我正在尝试使用会话限制用户多次登录以下是我的代码

我的模型

    class LoggedInUser(models.Model):
        user = models.OneToOneField(CustomUser, related_name='logged_in_user', on_delete =models.CASCADE)
        session_key = models.CharField(max_length=40, null=True, blank=True)
    
        def __str__(self):
        return self.user.username

我的中间件

ef MySessionMiddleware(get_response):
  
    def my_function(request):
  
        if request.user.is_authenticated:
            try:
                user = LoggedInUser.objects.filter(user=request.user).first()
            except:
                user = LoggedInUser.objects.create(user=request.user)
            
             if user.session_key:
                 #check whether old key is same as current
                 print('here inside user.session_key')
                 if user.session_key != request.session.session_key:
                    return JsonResponse("you already have a active session kindly logout from that", 
                            status=400, safe=False)
             user.session_key = request.session.session_key
             user.save()
                
        response = get_response(request)
                
        return response
    return my_function

我的中间件设置

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'pwned_passwords_django.middleware.PwnedPasswordsMiddleware',
    'oneFA.middlewares.password_validator_middleware',
    'oneFA.middlewares.MySessionMiddleware',
]

我的逻辑

我创建了一个模型,该模型使用我的身份验证模型 CustomUSer 和会话密钥存储具有 OnetoOne 字段的用户,然后每次我拨打电话时,我都试图检查当前会话密钥与前一个会话密钥,如果它不一样,那么用户正在尝试再次登录,所以我返回错误

我的错误

request.user.is_authenticated 总是假的,这意味着用户现在没有经过身份验证,我什至尝试将我的中间件放在身份验证中间件之前,并在做出响应后进行我的工作,即在返回周期中再次调用每个中间件但它给我同样的,所以当用户通过身份验证时我需要帮助,以便我可以检查会话密钥或需要在我的方法中进行更改

标签: django

解决方案


推荐阅读