Skip to content
Snippets Groups Projects

Resolve "[LDAP] Allow multiple search bases for users and groups"

Files
4
+ 30
12
@@ -209,6 +209,7 @@ if _settings.get("ldap.uri", None):
import ldap # noqa
from django_auth_ldap.config import (
LDAPSearch,
LDAPSearchUnion,
NestedGroupOfNamesType,
NestedGroupOfUniqueNamesType,
PosixGroupType,
@@ -224,27 +225,44 @@ if _settings.get("ldap.uri", None):
AUTH_LDAP_BIND_DN = _settings.get("ldap.bind.dn")
AUTH_LDAP_BIND_PASSWORD = _settings.get("ldap.bind.password")
# The TOML config might contain either one table or an array of tables
_AUTH_LDAP_USER_SETTINGS = _settings.get("ldap.users.search")
if not isinstance(_AUTH_LDAP_USER_SETTINGS, list):
_AUTH_LDAP_USER_SETTINGS = [_AUTH_LDAP_USER_SETTINGS]
# Search attributes to find users by username
AUTH_LDAP_USER_SEARCH = LDAPSearch(
_settings.get("ldap.users.base"),
ldap.SCOPE_SUBTREE,
_settings.get("ldap.users.filter", "(uid=%(user)s)"),
AUTH_LDAP_USER_SEARCH = LDAPSearchUnion(
*[
LDAPSearch(entry["base"], ldap.SCOPE_SUBTREE, entry.get("filter", "(uid=%(user)s)"),)
for entry in _AUTH_LDAP_USER_SETTINGS
]
)
# Mapping of LDAP attributes to Django model fields
AUTH_LDAP_USER_ATTR_MAP = {
"first_name": _settings.get("ldap.map.first_name", "givenName"),
"last_name": _settings.get("ldap.map.last_name", "sn"),
"email": _settings.get("ldap.map.email", "mail"),
"first_name": _settings.get("ldap.users.map.first_name", "givenName"),
"last_name": _settings.get("ldap.users.map.last_name", "sn"),
"email": _settings.get("ldap.users.map.email", "mail"),
}
# Discover flags by LDAP groups
if _settings.get("ldap.groups.base", None):
if _settings.get("ldap.groups.search", None):
group_type = _settings.get("ldap.groups.type", "groupOfNames")
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
_settings.get("ldap.groups.base"),
ldap.SCOPE_SUBTREE,
_settings.get("ldap.groups.filter", f"(objectClass={group_type})"),
# The TOML config might contain either one table or an array of tables
_AUTH_LDAP_GROUP_SETTINGS = _settings.get("ldap.groups.search")
if not isinstance(_AUTH_LDAP_GROUP_SETTINGS, list):
_AUTH_LDAP_GROUP_SETTINGS = [_AUTH_LDAP_GROUP_SETTINGS]
AUTH_LDAP_GROUP_SEARCH = LDAPSearchUnion(
*[
LDAPSearch(
entry["base"],
ldap.SCOPE_SUBTREE,
entry.get("filter", f"(objectClass={group_type})"),
)
for entry in _AUTH_LDAP_GROUP_SETTINGS
]
)
_group_type = _settings.get("ldap.groups.type", "groupOfNames").lower()
Loading