切换到生产时,登录表单停止工作

时间:2018-06-12 11:31:50

标签: django gunicorn wagtail django-auth-ldap

我正在使用Wagtail 2.1,Django 1.11.13,django-auth-ldap 1.6.1和gunicorn 19.8.1(Nginx作为代理服务器)。

我创建了两种不同的登录方式,即AJAX视图:

def loginajax(request):
# Identation is okay, can't seem to paste it properly
if request.method == 'POST':
    login_form = AuthenticationForm(data=request.POST)
    response_data = {}
    if login_form.is_valid():
        response_data['result'] = '1'
        response_data['message'] = 'You"re logged in'
        user = authenticate(username=login_form.cleaned_data['username'],
                            password=login_form.cleaned_data['password'])
        login(request, user)
    else:
        response_data['result'] = '0'
        response_data['message'] = login_form.errors

    return JsonResponse(response_data)

- 一个常规,非常标准的Django登录表单。

{% block content %}
<div class="login-form" style="width: 90%; margin: 0 auto;">
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}

{% if next %}
    {% if user.is_authenticated %}
    <p>Your account doesn't have access to this page. To proceed,
    please login with an account that has access.</p>
    {% else %}
    <p>Please login to see this page.</p>
    {% endif %}
{% endif %}

<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<table>
<tr>
    <td>{{ form.username.label_tag }}</td>
    <td>{{ form.username }}</td>
</tr>
<tr>
    <td>{{ form.password.label_tag }}</td>
    <td>{{ form.password }}</td>
</tr>
</table>

<input type="submit" value="login" />
<input type="hidden" name="next" value="{% if next %}{{ next }}{% endif %}" />
</form>
</div>
{% endblock %}

我正在使用LDAP,并使用常规身份验证后端作为备份:

AUTHENTICATION_BACKENDS = [
  'django_auth_ldap.backend.LDAPBackend',
  'django.contrib.auth.backends.ModelBackend',
]

在开发模式下运行我的代码时(通过manage.py runserver),登录方法适用于两种登录方法(我可以看到验证用户的dlango-ldap调试消息)。

但是,只要我使用生产就绪模式(使用gunicorn,禁用DEBUG,切换到生产设置),我的所有登录请求都会出现LDAP错误:

  

在验证bvolchok时遇到LDAPError:INVALID_CREDENTIALS({'desc':'无效凭据','info':'80090308:LdapErr:DSID-0C09042A,评论:AcceptSecurityContext错误,数据52e,v3839'},)

对于Ajax视图,打印request.POST对象会返回与Django集成服务器和Gunicorn相同的结果:

  

QueryDict:{'csrfmiddlewaretoken':['redacted'],'username':['redacted'],'password':['redacted'],'next':['']}&gt;

基本上,我的问题是,在“生产模式”中,login_form.is_valid()总是为假......

1 个答案:

答案 0 :(得分:0)

愚蠢的我,我正在将环境变量传递给django-auth-ldap,其中一个有空格,其vaule被截断了。