【问题标题】:django_auth_ldap raises OPERATIONS_ERRORdjango_auth_ldap 引发 OPERATIONS_ERROR
【发布时间】:2012-02-13 14:03:52
【问题描述】:

我正在尝试针对我们的 LDAP 构建用户身份验证:

settings.py:

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

AUTH_LDAP_SERVER_URI = "ldap://********-dc01.*******.ru"

import ldap
from django_auth_ldap.config import LDAPSearch

AUTH_LDAP_BIND_DN = ""
AUTH_LDAP_BIND_PASSWORD = ""
AUTH_LDAP_USER_SEARCH = LDAPSearch("cn=users,dc=*********,dc=ru",ldap.SCOPE_SUBTREE,"(uid=%(user)s)")

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

import logging

logger = logging.getLogger('django_auth_ldap')
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)

views.py:

@login_required
def project_list(request):
...

urls.py:

(r'^accounts/login/$', 'django.contrib.auth.views.login',{'template_name':'login.html'}),

模板是from this example

它会带我去验证表单,我会得到以下调试输出:

search_s('cn=users,dc=********,dc=ru', 2, '(uid=bolotnov)') raised OPERATIONS_ERROR({'info': '000004DC: LdapErr: DSID-0C0906DC, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v1db0', 'desc': 'Operations error'},)
search_s('cn=users,dc=**********,dc=ru', 2, '(uid=bolotnov)') raised OPERATIONS_ERROR({'info': '000004DC: LdapErr: DSID-0C0906DC, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v1db0', 'desc': 'Operations error'},)
Authentication failed for bolotnov
Authentication failed for bolotnov

我尝试使用谷歌搜索,但没有找到任何可以帮助我进一步提高的东西,也许是来自社区的提示 - 也许我缺少一些简单的东西或者需要检查一下?我似乎可以通过 Softerra LDAP 浏览器匿名绑定到我们的 ldap,也许 ldap_auth_user_search 应该有些不同?

【问题讨论】:

  • 我想我知道问题出在哪里,但还无法验证。它将尝试使用用户在登录/密码字段中提供的相同凭据绑定到 LDAP 服务器以获得用户的首选项。发生的情况是 - 用户很高兴地找到/验证了登录/密码令牌但绑定到 LDAP,服务器也期望提供域名 - 这就是导致问题的原因。

标签: django ldap django-authentication python-ldap


【解决方案1】:

虽然 ldap_simple_bind_s() 会返回一个成功的绑定,但这是关于我必须禁用的推荐选项才能使其工作:

ldap.set_option(ldap.OPT_REFERRALS, 0)

【讨论】:

    【解决方案2】:

    你需要绑定到服务器,即使是匿名绑定。

    因此你必须有真正的价值

    AUTH_LDAP_BIND_DN = ""
    AUTH_LDAP_BIND_PASSWORD = ""
    

    【讨论】:

      【解决方案3】:

      我不知道我是否可以在这篇文章中提出另一个问题。 在views.py中我有这样的东西:

      def 登录(请求):

      c = {}
      c.update(csrf(request))
      return render_to_response('login.html', c)
      

      def auth_view(请求):

      用户名 = request.POST.get('用户名', '') 密码 = request.POST.get('密码', '') user = auth.authenticate(username=username, password=password)

      如果用户不是无: auth.login(请求,用户) return HttpResponseRedirect('/loggedin') 别的: return HttpResponseRedirect('/invalid')

      我的问题是如何将它与 ldap 服务器绑定? 在 django 文档中有用于记录的模板:

      导入日志

      logger = logging.getLogger('django_auth_ldap') logger.addHandler(logging.StreamHandler()) logger.setLevel(logging.DEBUG)

      但我不知道如何在 rhis 代码中准确实现

      【讨论】:

        【解决方案4】:

        是的,我已经在 settings.py 中找到了:

        AUTH_LDAP_SERVER_URI = "ldap://myldapadress"

        AUTH_LDAP_BIND_DN = "" AUTH_LDAP_BIND_PASSWORD = "" AUTH_LDAP_USER_SEARCH = LDAPSearch("我的搜索配置", ldap.SCOPE_SUBTREE, "uid=uid")

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

        logger = logging.getLogger('django_auth_ldap')

        logger.addHandler(logging.StreamHandler()) logger.setLevel(logging.DEBUG)

        但我的问题是我应该在哪里以及如何实现 ldap 登录,以便 view.py 中的这个功能可以使用它。 抱歉有任何英语错误和过于笼统的问题

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-02
          • 2020-07-12
          相关资源
          最近更新 更多