我使用django-auth-ldap
作为我的后端来验证我的LDAP目录。我的所有配置都在settings.py
,我可以毫无问题地验证自己。
但是,我不知道如何搜索LDAP目录并获得与输入字段中输入的前几个字符匹配的用户列表。
我不想在视图中重复自己。我想基本上做user_list = LDAPBackend().search(term)
之类的事情,其中term是在页面上的输入字段中输入的字符串。然后我将user_list
的JSON转储返回到页面以填充页面上的下拉列表。
以下是我已有的代码片段:
通过Ajax发送输入到Django视图的字符:
JS加载$(document).ready()
:
$("input#people").autocomplete({
source: "{% url 'people_search' %}",
minLength: 3,
select: function (event, ui) {
//process selected user
}
});
在Django视图中接收输入的文本:
def people_search(request):
term = request.GET.get('term') # term => text sent from the page
user_list = []
user_list = LDAPBackend().search(term) # search does not exist. I need to populate this array with all users that match the captured term.
return HttpResponse(json.dumps(user_list))
settings.py
:
# LDAP Authentication
import ldap
from django_auth_ldap.config import LDAPSearch, NestedGroupOfNamesType
AUTH_LDAP_SERVER_URI = 'ldap://mydomain.com:3268'
AUTH_LDAP_BIND_DN = 'my_uname'
AUTH_LDAP_BIND_PASSWORD = 'my_pass'
AUTH_LDAP_USER_SEARCH = LDAPSearch("DC=site,DC=domain,DC=com", ldap.SCOPE_SUBTREE, "(&(objectClass=*)(sAMAccountName=%(user)s))")
AUTH_LDAP_GROUP_SEARCH = LDAPSearch("DC=site,DC=domain,DC=com", ldap.SCOPE_SUBTREE, "(objectClass=group)")
AUTH_LDAP_GROUP_TYPE = NestedGroupOfNamesType()
AUTH_LDAP_CONNECTION_OPTIONS = {
ldap.OPT_DEBUG_LEVEL: 0,
ldap.OPT_REFERRALS: 0,
}
AUTH_LDAP_USER_ATTR_MAP = {
"first_name": "givenName",
"last_name": "sn",
"email": "mail",
}
AUTH_LDAP_PROFILE_ATTR_MAP = {
"employee_id": "employeeID",
}
AUTH_LDAP_ALWAYS_UPDATE_USER = True
AUTH_LDAP_FIND_GROUP_PERMS = True
注意:视图people_search
由@login_required
修饰。如果我未经过身份验证,我会被重定向到登录页面,在那里我能够成功user = LDAPBackend().authenticate(username=username, password=password)
我在settings.py中看到了AUTH_LDAP_USER_SEARCH
,但我不确定如何使用它。文档对我没有帮助。
另外,理想情况下,我想尽快进行搜索。在Microsoft Outlook中,我能够快速搜索LDAP目录。我相信我的计算机上的所有用户都是cached。我可以将所有用户缓存在我的Django服务器上。
感谢您的协助。
答案 0 :(得分:-2)
要在对象名称未知但对象名称中的某些字符已知的情况下搜索对象,请使用尽可能低的搜索范围并使用子字符串过滤器。下面的过滤器是子字符串过滤器:
(cn=shail*)