Django:使用@login_required并设置LOGIN_URL时出现信息泄漏问题

时间:2010-01-11 13:47:28

标签: python django authentication django-urls

使用@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很多。

杰拉德。

1 个答案:

答案 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),
)