使用@login_required装饰器并设置LOGIN_URL变量时,我发现了一种信息泄露形式。
我的网站需要强制登录所有内容。问题是,当它是现有页面时,您将被重定向到登录页面,并设置下一个变量。
所以当没有登录并要求:
http://localhost:8000/validurl/
你看到了:
http://localhost:8000/login/?next=/validurl/
请求不存在的页面时:
http://localhost:8000/faultyurl/
你看到了:
http://localhost:8000/login/
这揭示了一些我不想要的信息。我想过覆盖login方法,强制下一个为空并在这个子类方法上调用'super'。
另一个问题是我的一些测试在没有设置LOGIN_URL的情况下失败。他们重定向到'/ accounts / login /'而不是'/ login /'。因此,为什么我要使用LOGIN_URL但禁用'自动下一个'功能。
任何人都可以对这个问题有所了解吗?
Thanx很多。
杰拉德。
答案 0 :(得分:5)
您可以将此行包含在urls.py
文件中的最后一个模式中。它会将与任何其他模式不匹配的URL重新路由到登录页面。
urlpatterns = patterns('',
...
(r'^(?P<path>.+)$', 'django.views.generic.simple.redirect_to', {
'url': '/login/?next=/%(path)s',
'permanent': False
}),
)
编辑:要继续向经过身份验证的用户筹集404页,请执行以下操作:
from django.http import Http404, HttpResponseRedirect
def fake_redirect(request, path):
if request.user.is_authenticated:
raise Http404()
else:
return HttpResponseRedirect('/login/?next=/%s' % path)
urlpatterns = patterns('',
...
(r'^(?P<path>.+)$', fake_redirect),
)