ابوالفضل وکیلی
ابوالفضل وکیلی
خواندن ۳ دقیقه·۷ ماه پیش

بررسی LDAP با Django

در این مقاله، نحوه اتصال و authenticate یک برنامه Django با یک سرور LDAP یا Lightweight Directory Access Protocol را بررسی خواهیم کرد. فریم ورک Django با یک بک‌اند authentication پیش‌فرض برای authenticate کردن اطلاعات کاربری با database ارائه شده همراه است. بنابراین به جای آن، Django App خود را به سرور LDAP وصل می‌کنیم تا کاربر با Active Directory خودش authenticate شود.

پیاده سازی LDAP

ما از django-auth-ldap استفاده خواهیم کرد، یک کتابخانه open-source عالی برای Django است. این کتابخانه با یک LDAP Authentication Backend داخلی عرضه می‌شود که authenticate کردن کاربران با سرور LDAP را بسیار آسان می‌کند.

سپس، یک login/logout REST API در django-rest-framework با استفاده از SessionAuthentication فریمورک rest برای authenticate کاربران با سرور LDAP ایجاد خواهیم کرد.


در فایل settings.py تنظیمات را اضافه نمایید.

مسیر uri سرور LDAP را اضافه کنید.

AUTH_LDAP_SERVER_URI = &quotldap://test.example.com:389&quot

اکنون admin سرور LDAP را اضافه کنید تا بتوانید عملیات جستجوی مختلف کاربر را انجام دهید.

AUTH_LDAP_BIND_DN = &quotcn=admin,dc=example,dc=com&quot AUTH_LDAP_BIND_PASSWORD = &quottest@1234&quot

اکنون مسیر جستجوی کاربران در دایرکتوری LDAP را اضافه کنید، یعنی در کدام پوشه باید LDAP برای کاربران جستجو کند. آرگومان ldap.SCOPE_SUBTREE به LDAP می گوید که در همه زیرپوشه های directory کاربران جستجو کند.

import ldap from django_auth_ldap.config import LDAPSearch AUTH_LDAP_USER_SEARCH = LDAPSearch(&quotOU=users,DC=example,DC=com&quot, ldap.SCOPE_SUBTREE, &quot(uid=% (user)s)&quot)

اکنون mapping را اضافه کنید تا ویژگی‌های مدل User جنگو را از LDAP directory پر کنید. پس از authentication موفقیت‌آمیز از سرور LDAP، مدل User جنگو با ویژگی‌های زیر پر می‌شود.

AUTH_LDAP_USER_ATTR_MAP = { &quotfirst_name&quot: &quotgivenName&quot, &quotlast_name&quot: &quotsn&quot, &quotemail&quot:&quotmail&quot }

حالا LDAP authentication backend را قبل از ModelBackend اضافه کنید تا ابتدا از طریق LDAP عمل authentication را به جای django Model Backend پیش فرض انجام دهد.

AUTHENTICATION_BACKENDS = ( &quotdjango_auth_ldap.backend.LDAPBackend&quot, &quotdjango.contrib.auth.backends.ModelBackend&quot, )

در نهایت، SessionAuthentication را به DEFAULT_AUTHENTICATION_CLASSES اضافه کنید.

REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', ), }

درباره Login API

در این قسمت، ابتدا authentication_classes را روی empty تنظیم می کنیم زیرا برای login api به pre-authentication نیاز نداریم. ما از توابع پیش فرض django یعنی authenticate() و login() استفاده خواهیم کرد.

هنگامی که تابع authenticate() اجرا می شود، django به طور خودکار ابتدا LDAPBackend را برای authenticate کاربران انتخاب می کند و در صورت عدم موفقیت، به سراغ backend بعدی یعنی ModelBackend می رود.

from django.contrib.auth import authenticate, login, logout from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView class LDAPLogin(APIView): &quot&quot&quot Class to authenticate a user via LDAP and then creating a login session &quot&quot&quot authentication_classes = () def post(self, request): &quot&quot&quot Api to login a user :param request: :return: &quot&quot&quot user_obj = authenticate(username=request.data['username'], password=request.data['password']) login(request, user_obj) data={'detail': 'User logged in successfully'} return Response(data, status=200)

نحوه Logout API

در اینجا، ما permission_classes را روی IsAuthenticated تنظیم می‌کنیم تا فقط فردی که وارد سیستم شده است بتواند درخواست logout را ارسال کند.

class LDAPLogout(APIView): &quot&quot&quot Class for logging out a user by clearing his/her session &quot&quot&quot permission_classes = (IsAuthenticated,) def post(self, request): &quot&quot&quot Api to logout a user :param request: :return: &quot&quot&quot logout(request) data={'detail': 'User logged out successfully'} return Response(data, status=200)


نتیجه گیری

تکنیک LDAP authentication مشکل بزرگی را در ایجاد حساب های جدید هنگام ورود به یک وب سایت جدید و به خاطر سپردن چندین مجموعه از login credential ها را حل می کند.

امیدوارم این مقاله نکاتی را در مورد authentication از طریق LDAP و مزایای مربوط به آن ارائه کرده باشد.




باتشکر از

https://medium.com/@itsayushbansal/ldap-authentication-with-django-a2b4f00c9a04

ldapdjangoauthenticationrestامنیت
instagram : @a_vakily7
شاید از این پست‌ها خوشتان بیاید