【问题标题】:How can I have Basic HTTP Authentication for a Django view?如何对 Django 视图进行基本 HTTP 身份验证?
【发布时间】:2013-05-24 21:41:14
【问题描述】:

我一直在花费数小时试图找到一种方法来为我的一个视图提供基本 HTTP 身份验证。这些是我尝试过的几种解决方案,但都没有成功。即使没有身份验证,请求仍会被处理。我正在使用 Django 1.4.3 版。这是我的 Django 视图:

@csrf_exempt
def facebook(request):
        if request.user.is_authenticated():
                fb_value= ast.literal_eval(request.body)
                queryset = Poster.objects.all().filter(fb_id__in = fb_value.values())
                data = serializers.serialize('json', queryset, fields = ('picture','fb_id',))
                return HttpResponse(data, 'application/javascript')
        else:
                return HttpResponse("This user is not authenticated")

我在没有认证的情况下发送了请求,它仍然返回了结果。这不应该发生。

我尝试的另一个解决方案来自我发现的一个名为 view by view basic authentication decorator 的 Django Snippet

我做了一个 httpauth.py 并从 sn-p 复制代码:

from mydjangoapp.httpauth import *

@csrf_exempt
@logged_in_or_basicauth()
def facebook(request):
        fb_value= ast.literal_eval(request.body)
        queryset = Poster.objects.all().filter(fb_id__in = fb_value.values())
        data = serializers.serialize('json', queryset, fields = ('picture','fb_id',))
        return HttpResponse(data, 'application/javascript')

我发送的请求没有经过身份验证,它仍然返回结果。用尽所有选项后,我求助于 Django 自己的 @login_required 装饰器:

from django.contrib.auth.decorators import login_required

@csrf_exempt
@login_required
def facebook(request):
        fb_value= ast.literal_eval(request.body)
        queryset = Poster.objects.all().filter(fb_id__in = fb_value.values())
        data = serializers.serialize('json', queryset, fields = ('picture','fb_id',))
        return HttpResponse(data, 'application/javascript')

这里是关于我的 settings.py 的更多信息:

MIDDLEWARE_CLASSES = (
        'django.middleware.common.CommonMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
)

AUTHENTICATION_BACKENDS = (
        'django.contrib.auth.backends.ModelBackend',
)

在尝试了所有这些选项之后,我不知道该怎么办。我在这里有什么遗漏吗?!

【问题讨论】:

  • 你使用的是什么版本的 Django?关于您的环境的详细信息越多越好。
  • @DavidS 我正在使用 Django 1.4.3
  • 您应该在 settings.py 文件中包含您正在使用的中间件。
  • @DavidS 感谢您的提示,我现在将其添加到我的问题中。
  • 既然你安装了会话中间件,我的直觉是你有一个 cookie 集。您应该查看有关中间件会话的文档,并确保您没有类似的简单内容。 docs.djangoproject.com/en/1.4/topics/http/sessions

标签: django django-views django-authentication


【解决方案1】:

这真的不是一个很好的答案。对不起,我必须在这里发布,但系统已将我从评论部分中删除。

我没有看到您使用 @login_required 装饰器的示例有任何问题。这通常是我在 Django 网站上的做法。这让我相信你在这里发生了两件事中的一件:

  1. 您的设置文件中存在配置问题
  2. 在初始测试期间,您实际上已经验证并创建了一个会话。

同样,我认为您的问题不在于您的代码。请发布您最终确定的问题,以便我(和其他人)可以从中吸取教训。

【讨论】:

  • 我已经尝试了所有解决方案并查看了 settings.py 以查看是否可以进行任何更改。我对你的答案投了赞成票。现在,我将保留问题,直到找到答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 2017-09-18
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多