如何在Django中实现LDAP身份验证,如何访问视图中的用户对象?

如何在Django中实现LDAP身份验证,如何访问视图中的用户对象?,django,ldap,Django,Ldap,我想使用Django构建一个站点,在这里,用户必须通过LDAP服务器进行身份验证。 我已经阅读了python ldap配置,并相应地配置了settings.py。我能够从本地数据库对用户进行身份验证,但当我尝试通过LDAP进行身份验证时,它不起作用 import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) TEMPLATE_DIRS = [os.path.join(BASE_DIR,'templates')] import

我想使用Django构建一个站点,在这里,用户必须通过LDAP服务器进行身份验证。 我已经阅读了python ldap配置,并相应地配置了settings.py。我能够从本地数据库对用户进行身份验证,但当我尝试通过LDAP进行身份验证时,它不起作用

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
TEMPLATE_DIRS = [os.path.join(BASE_DIR,'templates')]

import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType

# Baseline configuration.
AUTH_LDAP_SERVER_URI = "ldap://10.1.10.10"

AUTH_LDAP_CONNECTION_OPTIONS = {
            ldap.OPT_REFERRALS: 0
} 

AUTH_LDAP_BIND_DN = "cn=myname,dc=example,dc=com"
AUTH_LDAP_BIND_PASSWORD = "dontevenask"

AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=users,dc=example,dc=com",
                                       ldap.SCOPE_SUBTREE, "(uid=%(user)s)")

#AUTH_LDAP_USER_DN_TEMPLATE = "uid=%(user)s,ou=users,dc=example,dc=com"

AUTH_LDAP_USER_ATTR_MAP = {
            "first_name": "givenName",
  "last_name": "sn",
            "email": "mail"
}


AUTH_LDAP_ALWAYS_UPDATE_USER = True
AUTH_LDAP_FIND_GROUP_PERMS = True

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

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '^eh5xdkui7vw!^x&l%q44ak6+yglnx5q(tqwd8l+w!sxml7q!&'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

TEMPLATE_DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'my_app',
)

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

ROOT_URLCONF = 'users.urls'

WSGI_APPLICATION = 'users.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.7/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS':{
                'read_default_file':'/home/user/config.cnf',
                 },
    }

}

# Internationalization
# https://docs.djangoproject.com/en/1.7/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.7/howto/static-files/

STATIC_URL = '/static/'
这是我的views.py文件

  def loggedin(request):
        uid = request.user.username
        return render_to_response('loggedin.html',
                                  {'full_name':uid})
以及loggedin.html文件

{% block content %}

        <h2> Hi {{full_name}} Logged in! </h2>
        <p> Click <a href="/accounts/logout/"> here </a> to logout </p>
{% endblock %}
{%block content%}
你好{{全名}已登录!
单击以注销

{%endblock%}
我确实参考了其他帖子,但没有找到解决办法


我缺少什么?

有几个问题可能会导致LDAP身份验证无法工作

我假设您正在运行linux主机。您是否已验证输入的LDAP设置是否正常工作?使用命令行工具“ldapsearch”验证服务器是否按预期工作和响应

在您成功地使用ldapsearch进行了身份验证并且身份验证在Django中仍然不起作用之后,我建议您将日志放到某个地方并粘贴


如果没有更多的信息,很难说你的设置的哪一部分是不正确的。

所以,答案来了

我将
(uid=%(用户)s)
更改为
(samaccountname=%(用户)s)
,成功了


让日志记录器帮助定位问题所在-它甚至与LDAP通信,或者只是试图通过本地数据库进行身份验证

嗯,我使用了logger并试图找出导致错误的原因。我的记录器显示“在验证用户名时捕获到Ldaperor:无效的凭据({'info':'80090308:LdapErr:DSID-0C0903C5,注释:AcceptSecurityContext错误,数据52e,v23f0','desc':'INVALID CREDENTIALS'),尽管凭据是正确的。我猜settings.py中有问题。还有其他输入吗?服务器说您提供的凭据无效,或者其他设置错误。您是否能够使用“ldapsearch”工具进行绑定?我认为django首先尝试使用您在登录时输入的凭证进行登录/绑定,这些也正确吗?用ldapsearch验证!是的,我可以从命令行连接到ldap,但没有使用django。这是一个settings.py问题。谢谢,日志帮助我找到了问题所在。很好,你听说你让它工作了!我看到你在用广告,我也是。我必须创建自己的后端,因为标准django ldap后端不提供任何SASL支持——它通过网络发送密码纯文本,因为AD服务器没有启用TLS支持。我有在线解决方案