在 Django 项目中使用中间件类进行用户身份验证

问题描述

我公司的一个项目是在 Django 中,我被分配到一个任务“向顶级路由器添加身份验证”,所以我们不要忘记为每个视图添加一个身份验证代码,例如:

if not request.user.is_authenticated:
    return HttpResponseRedirect('/admin/login/?next=/admin/some-page/')

经过一番研究后,我发现这可以通过编写自己的中间件来实现。在做功课之前,我根本不熟悉这个概念。因此,现在我正在尝试编写一个 LoginrequiredMiddleware 类,该类拦截每个请求并将用户发送到未通过身份验证的登录页面,并在身份验证后发送到用户尝试访问的原始页面

这是我目前的代码middleware.py

from django.conf import settings
from django.http import HttpResponseRedirect
from django.utils.deprecation import MiddlewareMixin
from django.utils.http import is_safe_url
import re


EXEMPT_URLS = [re.compile(settings.LOGIN_REDIRECT_URL.lstrip('/'))] # '/admin'


class LoginrequiredMiddleware(MiddlewareMixin):

    def process_request(self,request):
        assert hasattr(request,'user'),"The Login required Middleware"
        if not request.user.is_authenticated:
            path = request.path_info.lstrip('/')
            
            if not any(m.match(path) for m in EXEMPT_URLS):
                redirect_to = settings.LOGIN_REDIRECT_URL

                if len(path) > 0 and is_safe_url(
                      url=request.path_info,allowed_hosts=request.get_host()):
                    redirect_to = f"{settings.LOGIN_REDIRECT_URL}/login?next={request.path_info}"

                return HttpResponseRedirect(redirect_to)

我已经在 MIDDLEWAREsettings.py 列表中注册了中间件,并同时包含了 SessionMiddlewareAuthenticationMiddleware,但我还没有设法让它工作。我可以在隐身模式下访问需要身份验证的页面,例如,无需登录

我想要一些关于我做错了什么或我应该遵循的更好路径的提示

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)