در این مقاله، نحوه اتصال و authenticate یک برنامه Django با یک سرور LDAP یا Lightweight Directory Access Protocol را بررسی خواهیم کرد. فریم ورک Django با یک بکاند authentication پیشفرض برای authenticate کردن اطلاعات کاربری با database ارائه شده همراه است. بنابراین به جای آن، Django App خود را به سرور LDAP وصل میکنیم تا کاربر با Active Directory خودش authenticate شود.
ما از django-auth-ldap استفاده خواهیم کرد، یک کتابخانه open-source عالی برای Django است. این کتابخانه با یک LDAP Authentication Backend داخلی عرضه میشود که authenticate کردن کاربران با سرور LDAP را بسیار آسان میکند.
سپس، یک login/logout REST API در django-rest-framework با استفاده از SessionAuthentication فریمورک rest برای authenticate کاربران با سرور LDAP ایجاد خواهیم کرد.
مسیر uri سرور LDAP را اضافه کنید.
AUTH_LDAP_SERVER_URI = "ldap://test.example.com:389"
اکنون admin سرور LDAP را اضافه کنید تا بتوانید عملیات جستجوی مختلف کاربر را انجام دهید.
AUTH_LDAP_BIND_DN = "cn=admin,dc=example,dc=com" AUTH_LDAP_BIND_PASSWORD = "test@1234"
اکنون مسیر جستجوی کاربران در دایرکتوری LDAP را اضافه کنید، یعنی در کدام پوشه باید LDAP برای کاربران جستجو کند. آرگومان ldap.SCOPE_SUBTREE به LDAP می گوید که در همه زیرپوشه های directory کاربران جستجو کند.
import ldap from django_auth_ldap.config import LDAPSearch AUTH_LDAP_USER_SEARCH = LDAPSearch("OU=users,DC=example,DC=com", ldap.SCOPE_SUBTREE, "(uid=% (user)s)")
اکنون mapping را اضافه کنید تا ویژگیهای مدل User جنگو را از LDAP directory پر کنید. پس از authentication موفقیتآمیز از سرور LDAP، مدل User جنگو با ویژگیهای زیر پر میشود.
AUTH_LDAP_USER_ATTR_MAP = { "first_name": "givenName", "last_name": "sn", "email":"mail" }
حالا LDAP authentication backend را قبل از ModelBackend اضافه کنید تا ابتدا از طریق LDAP عمل authentication را به جای django Model Backend پیش فرض انجام دهد.
AUTHENTICATION_BACKENDS = ( "django_auth_ldap.backend.LDAPBackend", "django.contrib.auth.backends.ModelBackend", )
در نهایت، SessionAuthentication را به DEFAULT_AUTHENTICATION_CLASSES اضافه کنید.
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', ), }
در این قسمت، ابتدا 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): """ Class to authenticate a user via LDAP and then creating a login session """ authentication_classes = () def post(self, request): """ Api to login a user :param request: :return: """ 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)
در اینجا، ما permission_classes را روی IsAuthenticated تنظیم میکنیم تا فقط فردی که وارد سیستم شده است بتواند درخواست logout را ارسال کند.
class LDAPLogout(APIView): """ Class for logging out a user by clearing his/her session """ permission_classes = (IsAuthenticated,) def post(self, request): """ Api to logout a user :param request: :return: """ 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