基于Django的站点上的用户需要第二次登录

基于Django的站点上的用户需要第二次登录,django,Django,我有一个基于Django 2.2的项目,它使用自定义用户模型、内置的Auth应用程序和Django All Auth进行用户管理。网站上几乎每个页面都有一个登录名,我们使用不同级别的权限来确定用户可以访问的内容 到目前为止,还不错,但现在我被要求将站点特定部分后面的所有内容都指定为“敏感”,需要使用相同的登录凭据进行第二次登录提示。这意味着,当客户端在设定的时间(比如30分钟)内第一次尝试访问/top secret/下的任何内容时,无论是否已登录,都希望看到登录出现 我在互联网上到处寻找如何做到

我有一个基于Django 2.2的项目,它使用自定义用户模型、内置的Auth应用程序和Django All Auth进行用户管理。网站上几乎每个页面都有一个登录名,我们使用不同级别的权限来确定用户可以访问的内容

到目前为止,还不错,但现在我被要求将站点特定部分后面的所有内容都指定为“敏感”,需要使用相同的登录凭据进行第二次登录提示。这意味着,当客户端在设定的时间(比如30分钟)内第一次尝试访问
/top secret/
下的任何内容时,无论是否已登录,都希望看到登录出现


我在互联网上到处寻找如何做到这一点的想法,但到目前为止,我还没有找到一个好的解决方案。这里有人有过类似的经历吗?如果有,他们能为我指出正确的方向吗?

找到了在我的情况下如何做到这一点的方法。我曾考虑过删除这个问题,但很可能还有其他人想做类似的事情,我就是这样做的

使用以下内容创建新的中间件:

from allauth.account.adapter import get_adapter
from datetime import datetime
from dateutil.relativedelta import relativedelta

from django.conf import settings
from django.shortcuts import redirect
from django.urls import reverse
from django.utils import timezone


class ExtraLoginPromptMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if request.user.is_authenticated:
            for url in settings.EXTRA_LOGIN_URLS:
                if request.path.startswith(url):
                    last_seen = request.session.get(settings.EXTRA_LOGIN_SESSION_VARIABLE)
                    if not last_seen:
                        last_seen = request.user.last_login
                    else:
                        last_seen = datetime.fromisoformat(last_seen)

                    if last_seen + relativedelta(seconds=settings.EXTRA_LOGIN_EXPIRY) < timezone.now():
                        # NB, this uses allauth, if you want to use django.auth, just
                        # call django.contrib.auth's logout instead
                        get_adapter(request).logout(request)
                        return redirect('{}?next={}'.format(reverse('account_login'), url))
                    else:
                        request.session[settings.EXTRA_LOGIN_SESSION_VARIABLE] = timezone.now().isoformat()

        return self.get_response(request)

您希望他们再次提供其特定于用户的登录详细信息还是另一组凭据?我们更希望使用相同的凭据。我会更新这个问题。也许你在找这样的问题,
EXTRA_LOGIN_URLS = ['/top-secret/', 'another-secret']
EXTRA_LOGIN_EXPIRY = 120  # How long before the "extra security" session expires
EXTRA_LOGIN_SESSION_VARIABLE = 'extra-login-last-seen'