我已在 EC2 上的 CentOS 6.2 x86_64 上设置了 Graphite Web 0.9.9,并尝试使 LDAP 身份验证能够与 389 目录服务器配合使用。我已使用以下内容配置了 local_settings.py:
- USE_LDAP_AUTH
- LDAP_URI
- LDAP 搜索基础
- LDAP_BASE_USER
- LDAP_BASE_PASS
- LDAP_用户_查询
但每次尝试登录时,我仍然会收到“身份验证尝试失败”的提示。查看 LDAP 服务器上的日志,似乎 graphite-web 根本没有连接到 LDAP 服务器。不幸的是,我在 graphite 服务器上的日志中看不到任何有用的信息 - 我只看到“access.log”和“info.log”。“error.log”和“exception.log”为空。
关于我可以做些什么来进一步解决这个问题,有什么好主意吗?
答案1
您是否在此 centos 6 主机上安装了 python-ldap 包?
我安装后就可以正常工作了,最小 centos 安装不包括它,epel 的 graphite 包没有将其标记为依赖项。安装后您需要重新加载 httpd。
答案2
访问日志应包含有关连接请求的所有内容。首先隔离防火墙并尝试 telnet。如果可以 telnet,请尝试针对 ldap 服务器运行本机 ldapsearch 并查看它是否返回数据。
访问日志将包含与该连接相关的所有数据。在清理 IP 地址后粘贴访问日志以调查问题。您也可以发送电子邮件至[电子邮件保护]如有任何问题。
答案3
如果您使用 LDAP 与 Active Directory 服务器进行通信,尝试关闭推荐追逐。
我将这些行添加到local_settings.py。
import ldap
ldap.set_option(ldap.OPT_REFERRALS, 0)
# Critcal for preventing timeouts due to AD search referrals not supported by LDAP v3.
# http://code.google.com/p/reviewboard/issues/detail?id=1641
答案4
从 django 1.11 开始,
现在,HttpRequest 被传递给 authenticate(),如果它接受请求参数,则它又将其传递给身份验证后端。
然后,从 django 2.1 开始,
身份验证后端的 authenticate() 方法需要 request 作为第一个位置参数。
而且似乎石墨graphite/account/ldapBackend.py
从未更新过。我将其request
作为该文件中的第一个参数添加authenticate
,然后登录成功了:
--- /usr/lib/python3/dist-packages/graphite/account/ldapBackend.py.old 2021-04-28 18:15:22.691462314 +0200
+++ /usr/lib/python3/dist-packages/graphite/account/ldapBackend.py 2021-04-28 18:19:30.654464317 +0200
@@ -18,7 +18,7 @@
class LDAPBackend:
- def authenticate(self, username=None, password=None):
+ def authenticate(self, request, username=None, password=None):
if settings.LDAP_USER_DN_TEMPLATE is not None:
settings.LDAP_BASE_USER = settings.LDAP_USER_DN_TEMPLATE % {'username': username}
settings.LDAP_BASE_PASS = password