Python 如何创建中间件在url发现之前拦截请求,以便未经授权的用户无法了解url?
我被要求为我公司的Django项目编写一个中间件,以避免在访问Python 如何创建中间件在url发现之前拦截请求,以便未经授权的用户无法了解url?,python,django,django-rest-framework,middleware,Python,Django,Django Rest Framework,Middleware,我被要求为我公司的Django项目编写一个中间件,以避免在访问admin/页面时重复用于用户身份验证的代码。为此,我编写了一个基本的LoginRequiredMiddleware 我用尽了我对中间件的知识,现在我必须给它一些类固醇,这样它可以避免外部各方发现我们项目中的现有视图,特别是对于我们的/api/ 现在,当有人试图访问如下内容时:api/v1/existing page,Django会遍历url,当它找到url视图对时,它会进行身份验证,中间件就会出现 但是,如果未经身份验证的用户尝试访
admin/
页面时重复用于用户身份验证的代码。为此,我编写了一个基本的LoginRequiredMiddleware
我用尽了我对中间件的知识,现在我必须给它一些类固醇,这样它可以避免外部各方发现我们项目中的现有视图,特别是对于我们的/api/
现在,当有人试图访问如下内容时:api/v1/existing page
,Django会遍历url,当它找到url视图对时,它会进行身份验证,中间件就会出现
但是,如果未经身份验证的用户尝试访问:api/vi/foo不存在/
页面,则我会得到一个未找到
页面(错误404)。我希望在Django开始扫描现有URL之前,让中间件拦截请求并请求用户身份验证(错误401 unauthorized)。这是一种安全措施,防止任何人了解项目的现有URL/视图
问题是我不知道从哪里开始
您可以编写自定义404处理程序来执行此操作:
# views.py
from django.shortcuts import redirect
from django.views.defaults import page_not_found
def custom_404_handler(request, exception):
if request.user.is_authenticated:
# return your own custom 404 page here, or use the
# default one if you haven't written one:
return page_not_found(request, exception)
# For unauthenticated users instead of returning a 404
# redirect them to a login page
return redirect("login_view")
您还可以添加一些额外的逻辑,以便仅对某些路径执行此操作,例如,仅对以api开头的路径等
中间件方式
但是这个想法是URL没有解析。说一个未在我的
URL\u模式中列出的URL
。我仍然希望将未经身份验证的用户重定向到登录页面,这样用户就不会知道该URL是否确实存在并与视图匹配,因为他首先被授权页面截获了啊,好的。这其实很容易。我会更新我的答案。
# urls.py
...
handler404 = "dotted.path.to.views.custom_404_handler"
class MyMiddleware:
def __call__(self, request):
# your other logic here
response = self.get_response(request)
if response.status == 404 and not request.user.is_authenticated:
return redirect("login_view")
return response