python - django autentication - 登录后的匿名用户

时间:2018-05-25 16:30:33

标签: python django django-authentication

我有一个充当API的django服务器(即侦听请求并仅返回数据),我希望此API只能由经过身份验证的用户访问。 我读到了django身份验证系统,并尝试根据文档(https://docs.djangoproject.com/en/2.0/topics/auth/default/)实现它。

我写了一个小网页只是为了测试身份验证 - 登录成功(服务器能够验证并登录用户),但是当尝试访问受限制的视图时,我没有访问权限,并且request.user已收到是一个AnonymousUser而不是登录用户。

我正在使用Python 3.6.5和Django 2.0.4

服务器代码:

@csrf_exempt
def dologin(request):
    username = request.POST.get('username')
    password = request.POST.get('password')
    if not username or not password:
        return HttpResponse('missing username or password', status=400)
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        return HttpResponse(user)
    else:
        return HttpResponse('bad credentials', status=422)

def dologout(request):
    logout(request)
    return HttpResponse('success')

@login_required()
def testAccess(request):
    return HttpResponse('ok')

def checkUser(request):
    u = "anonymous" if not request.user.is_authenticated else request.user.username
    return HttpResponse(u)

客户代码:

<label>username:</label>
<input type="text" id="uin"/>
<label>username:</label>
<input type="text" id="pin"/>
<button id="inbtn">login</button>
<button id="outbtn">logout</button>
<button id="test">test access</button>
<button id="check">check user</button>

<div id="res"></div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js" type="text/javascript"></script>
<script>
    $("#inbtn").click(function(){
        u = $("#uin").val();
        p = $("#pin").val();
        d = {username: u, password: p};
        $.post("http://10.0.0.9:8000/login/", d, function(data){
            $("#res").html(data);
        }).fail(function(xhr, status, error){
            $("#res").html(xhr.responseText + " - " + xhr.status);
        });
    });

    $("#outbtn").click(function(){
        $.get("http://10.0.0.9:8000/logout/", function(data){
            $("#res").html(data);
        }).fail(function(xhr, status, error){
            $("#res").html(xhr.responseText + " - " + xhr.status);
        });
    });

    $("#test").click(function(){
        $.get("http://10.0.0.9:8000/testaccess/", function(data){
            $("#res").html(data);
        }).fail(function(xhr, status, error){
            $("#res").html(xhr.responseText + " - " + xhr.status);
        });
    });

    $("#check").click(function(){
        $.get("http://10.0.0.9:8000/checkuser/", function(data){
            $("#res").html(data);
        }).fail(function(xhr, status, error){
            $("#res").html(xhr.responseText + " - " + xhr.status);
        });
    });
</script>

(我在本地运行所有内容,这就是为什么我使用10.0.0.9这是我的电脑的ip)

正如我之前写的 - 在成功登录后,单击“测试访问”会产生404响应,单击“检查用户”将返回“匿名”(通过调试服务器,我知道用户确实是AnonymousUser)

1 个答案:

答案 0 :(得分:0)

我怀疑你的问题与会话数据有关。

在身份验证和登录后,用户设置在一个django session内。 HTTP cookie(默认名称为sessionid)将使用会话编号设置。

对于每个subsecuent请求,您还需要将sessionid传递给服务器,以便服务器可以识别此新请求所属的用户。

您应该了解如何在登录后获取sessionid Cookie,以及如何将相同的sessionid与新请求一起发送。