Skip to content

Commit 184b54c

Browse files
authored
Merge pull request #1156 from Kooper/ldap_auth_v2
feat(api): LDAP authentication
2 parents 51cab9d + 9a37656 commit 184b54c

3 files changed

Lines changed: 53 additions & 1 deletion

File tree

rootfs/Dockerfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@ RUN adduser --system \
99

1010
COPY requirements.txt /app/requirements.txt
1111

12-
RUN buildDeps='gcc git libffi-dev libpq-dev python3-dev python3-pip python3-wheel python3-setuptools'; \
12+
RUN buildDeps='gcc git libffi-dev libpq-dev libldap2-dev libsasl2-dev python3-dev python3-pip python3-wheel python3-setuptools'; \
1313
apt-get update && \
1414
apt-get install -y --no-install-recommends \
1515
$buildDeps \
1616
sudo \
1717
libpq5 \
18+
libldap-2.4 \
1819
python3-minimal \
1920
# cryptography package needs pkg_resources
2021
python3-pkg-resources && \

rootfs/api/settings/production.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
from distutils.util import strtobool
55
import os.path
66
import tempfile
7+
import ldap
8+
9+
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType
710

811
# A boolean that turns on/off debug mode.
912
# https://docs.djangoproject.com/en/1.9/ref/settings/#debug
@@ -106,6 +109,7 @@
106109
)
107110

108111
AUTHENTICATION_BACKENDS = (
112+
"django_auth_ldap.backend.LDAPBackend",
109113
"django.contrib.auth.backends.ModelBackend",
110114
"guardian.backends.ObjectPermissionBackend",
111115
)
@@ -346,3 +350,48 @@
346350
}
347351

348352
APP_URL_REGEX = '[a-z0-9-]+'
353+
354+
# LDAP settings taken from environment variables.
355+
LDAP_ENDPOINT = os.environ.get('LDAP_ENDPOINT', '')
356+
LDAP_BIND_DN = os.environ.get('LDAP_BIND_DN', '')
357+
LDAP_BIND_PASSWORD = os.environ.get('LDAP_BIND_PASSWORD', '')
358+
LDAP_USER_BASEDN = os.environ.get('LDAP_USER_BASEDN', '')
359+
LDAP_USER_FILTER = os.environ.get('LDAP_USER_FILTER', 'username')
360+
LDAP_GROUP_BASEDN = os.environ.get('LDAP_GROUP_BASEDN', '')
361+
LDAP_GROUP_FILTER = os.environ.get('LDAP_GROUP_FILTER', '')
362+
363+
# Django LDAP backend configuration.
364+
# See https://pythonhosted.org/django-auth-ldap/reference.html
365+
# for variables' details.
366+
# In order to debug LDAP configuration it is possible to enable
367+
# verbose logging from auth-ldap plugin:
368+
# https://pythonhosted.org/django-auth-ldap/logging.html
369+
370+
AUTH_LDAP_SERVER_URI = LDAP_ENDPOINT
371+
AUTH_LDAP_BIND_DN = LDAP_BIND_DN
372+
AUTH_LDAP_BIND_PASSWORD = LDAP_BIND_PASSWORD
373+
AUTH_LDAP_USER_SEARCH = LDAPSearch(
374+
base_dn=LDAP_USER_BASEDN,
375+
scope=ldap.SCOPE_SUBTREE,
376+
filterstr="(%s=%%(user)s)" % LDAP_USER_FILTER
377+
)
378+
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
379+
base_dn=LDAP_GROUP_BASEDN,
380+
scope=ldap.SCOPE_SUBTREE,
381+
filterstr="(%s)" % LDAP_GROUP_FILTER
382+
)
383+
AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()
384+
AUTH_LDAP_USER_ATTR_MAP = {
385+
"first_name": "givenName",
386+
"last_name": "sn",
387+
"email": "mail",
388+
"username": LDAP_USER_FILTER,
389+
}
390+
AUTH_LDAP_GLOBAL_OPTIONS = {
391+
ldap.OPT_X_TLS_REQUIRE_CERT: False,
392+
ldap.OPT_REFERRALS: False
393+
}
394+
AUTH_LDAP_ALWAYS_UPDATE_USER = True
395+
AUTH_LDAP_MIRROR_GROUPS = True
396+
AUTH_LDAP_FIND_GROUP_PERMS = True
397+
AUTH_LDAP_CACHE_GROUPS = False

rootfs/requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Deis controller requirements
22
backoff==1.3.2
33
Django==1.10.4
4+
django-auth-ldap==1.2.8
45
django-cors-middleware==1.3.1
56
django-guardian==1.4.6
67
djangorestframework==3.5.3
@@ -12,6 +13,7 @@ morph==0.1.2
1213
ndg-httpsclient==0.4.2
1314
packaging==16.8
1415
psycopg2==2.6.2
16+
pyldap==2.4.25.1
1517
pyOpenSSL==16.2.0
1618
pytz==2016.10
1719
requests==2.12.3

0 commit comments

Comments
 (0)