كيفية استخدام مصادقة المستخدم في جانغو

مصادقة المستخدم هي عملية التحقق من هوية المستخدم عند وصوله إلى نظام أو تطبيق. و هو إجراء أمني أساسي يساعد على الحماية من الوصول غير المصرح به ويضمن أن المستخدمين المصرح لهم فقط هم من يمكنهم الوصول إلى المعلومات الحساسة أو تنفيذ إجراءات معينة.

في جانغوo، يتم تنفيذ مصادقة المستخدم باستخدام حزمة django.contrib.auth، والتي توفر مجموعة من العروض و الإستمارات المدمجة و التي يمكن تخصيصها بسهولة لتناسب احتياجات التطبيق الخاص بك. في هذه المقالة، سنستكشف كيفية استخدام حزمة django.contrib.auth لإضافة مصادقة المستخدم إلى مشروع جانغو.

قبل التعمق في تفاصيل نظام مصادقة جانغو، من المهم فهم المفاهيم والمكونات الأساسية التي تشكل مصادقة المستخدم في تطبيقات الويب. وتشمل هذه حسابات المستخدمين وكلمات المرور والجلسات.

تمثل حسابات المستخدمين كل المستخدمين الفرديين الذين تم منحهم حق الوصول إلى النظام أو التطبيق. يرتبط كل حساب مستخدم عادةً باسم مستخدم وكلمة مرور فريدين يتم استخدامهما للتحقق من هوية المستخدم عند تسجيل الدخول.

تُستخدم الجلسات للحفاظ على حالة مصادقة المستخدم عبر طلبات متعددة. عندما يقوم المستخدم بتسجيل الدخول، يتم إنشاء جلسة لتتبع حالة المصادقة الخاصة به حتى يقوم بتسجيل الخروج أو تنتهي صلاحية الجلسة.

مع وضع هذه المفاهيم في الاعتبار، يمكننا الآن التعمق في تفاصيل كيفية عمل مصادقة المستخدم في جانغو باستخدام الحزمة django.contrib.auth.

إعداد حزمة مصادقة جانغو

لاستخدام حزمة django.contrib.auth في مشروع جانغو تحتاج أولاً إلى تضمينها في قائمة INSTALLED_APPS في ملف settings.py الخاص بمشروعك.

INSTALLED_APPS = [    ...    'django.contrib.auth',    ...]

بعد ذلك، ستحتاج إلى تضمين أنماط عنوان URL لـ django.contrib.auth في ملف urls.py الرئيسي لمشروعك.

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('django.contrib.auth.urls')),
]

سيؤدي هذا إلى تمكين العروض و إستمارات المصادقة المدمجة التي يوفرها django.contrib.auth، والتي يمكنك استخدامها للتعامل مع تسجيل دخول و خروج المستخدم.

من الجيد أيضًا تعيين إعدادات LOGIN_URL و LOGIN_REDIRECT_URL في ملف settings.py. حيث يحدد LOGIN_URL عنوان URL الذي يجب إعادة توجيه المستخدمين إليه عندما يحتاجون إلى تسجيل الدخول، ويحدد LOGIN_REDIRECT_URL عنوان URL لإعادة التوجيه إليه بعد تسجيل الدخول بنجاح.

LOGIN_URL = '/accounts/login/'
LOGIN_REDIRECT_URL = '/'

من خلال هذه الخطوات، ستكون الآن قادرًا على استخدام حزمة django.contrib.auth لإضافة مصادقة المستخدم إلى مشروع جانغو.

في القسم التالي، سننظر في كيفية إنشاء نموذج مستخدم مخصص باستخدام فئات AbstractBaseUser و BaseUserManager الخاصة بـ جانغو.

إنشاء نموذج مستخدم باستخدام AbstractBaseUser وBaseUserManager

افتراضيًا، تحتوي حزمة django.contrib.auth على نموذج مستخدم يخزن معلومات المستخدم الأساسية مثل اسم المستخدم وكلمة المرور وعنوان البريد الإلكتروني. ومع ذلك، قد ترغب في تخصيص هذا النموذج لتخزين حقول إضافية أو تنفيذ سلوك مخصص.

لإنشاء نموذج مستخدم مخصص، يمكنك إنشاء فئة فرعية AbstractBaseUser و BaseUserManager من وحدة django.contrib.auth.models. حيث يوفر AbstractBaseUser التنفيذ الأساسي لنموذج المستخدم، بما في ذلك حقول اسم المستخدم وكلمة المرور وعنوان البريد الإلكتروني، بالإضافة إلى طرق إدارة حالة مصادقة المستخدم. و يوفر BaseUserManager طرقًا مساعدة لإنشاء كائنات المستخدم والتعامل معها.

فيما يلي مثال لكيفية إنشاء نموذج مستخدم مخصص باستخدام AbstractBaseUser و BaseUserManager :

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.db import models

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('The Email field must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        return self.create_user(email, password, **extra_fields)

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']

في هذا المثال، قمنا بتعريف نموذج CustomUser مخصص يتضمن حقول البريد الإلكتروني للمستخدم، والاسم الأول، واسم العائلة، بالإضافة إلى فئة CustomUserManager لإنشاء كائنات CustomUser والتعامل معها.

لاستخدام نموذج المستخدم المخصص ستحتاج إلى تحديده في إعداد AUTH_USER_MODEL في ملف settings.py.

AUTH_USER_MODEL = 'myapp.CustomUser'

من خلال هذه الخطوات، ستكون قادرا على استخدام نموذج المستخدم المخصص مع حزمة django.contrib.auth للتعامل مع مصادقة المستخدم في مشروعك. في القسم التالي، سننظر في كيفية استخدام نماذج وطرق المصادقة المدمجة في جانغو للتعامل مع تسجيل دخول المستخدم وتسجيله.

استخدام إستمارات و عروض المصادقة الخاصة بـ جانغو

تتضمن حزمة django.contrib.auth مجموعة من الإستمارات و العروض المدمجة التي يمكنك استخدامها للتعامل مع تسجيل دخول و خروج المستخدم والتسجيل.

للتعامل مع تسجيل دخول المستخدم، يمكنك استخدام عرض تسجيل الدخول و إستمارة AuthenticationForm المقدم من django.contrib.auth. حيث يعرض عرض تسجيل الدخول إستمارة تسجيل دخول للمستخدم وتتحقق من بيانات الاعتماد الخاصة به عند إرسال الإستمارة. كما تعالج إستمارة AuthenticationForm التحقق من صحة الإدخال والمصادقة.

فيما يلي مثال لكيفية استخدام عرض تسجيل الدخول و إستمارة AuthenticationForm في دالة عرض جانغو:

from django.contrib.auth import authenticate, login
from django.contrib.auth.forms import AuthenticationForm
from django.shortcuts import render, redirect

def login_view(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, data=request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = authenticate(username=username, password=password)
            if user is not None:
                login(request, user)
                return redirect('home')
    else:
        form = AuthenticationForm()
    return render(request, 'login.html', {'form': form})

في هذا المثال، قمنا بتعريف دالة  login_view التي تعرض إستمارة تسجيل دخول للمستخدم وتصادق على بيانات الاعتماد الخاصة به عند إرسال الإستمارة. إذا تم تسجيل الدخول بنجاح، تتم إعادة توجيه المستخدم إلى العرض الرئيسي.

للتعامل مع تسجيل خروج المستخدم، يمكنك استخدام عرض  logout المقدم من django.contrib.auth. حيث يؤدي عرض  logout إلى تدمير جلسة المستخدم وتسجيل خروجه من النظام.

فيما يلي مثال لكيفية استخدام عرض  logout:

from django.contrib.auth import logout
from django.shortcuts import redirect

def logout_view(request):
    logout(request)
    return redirect('login')

و للتعامل مع تسجيل المستخدم، يمكنك إنشاء إستمارة مخصصة وعرض للتعامل مع التحقق من صحة الإدخال وإنشاء حسابات مستخدمين جديدة. فيما يلي مثال لكيفية إنشاء إستمارة تسجيل مخصص وعرضه في جانغو:

from django import forms
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect


class RegistrationForm(forms.Form):
    email = forms.EmailField()
    password = forms.CharField(widget=forms.PasswordInput)
    password_confirm = forms.CharField(widget=forms.PasswordInput)

    def clean_email(self):
        email = self.cleaned_data.get('email')
        if User.objects.filter(email=email).exists():
            raise forms.ValidationError(
                'A user with that email already exists')
        return email

    def clean(self):
        cleaned_data = super().clean()
        password = cleaned_data.get('password')
        password_confirm = cleaned_data.get('password_confirm')
        if password != password_confirm:
            raise forms.ValidationError('Passwords do not match')

    def register(request):
        if request.method == 'POST':
            form = RegistrationForm(request.POST)
            if form.is_valid():
                email = form.cleaned_data.get('email')
                password = form.cleaned_data.get('password')
                User.objects.create_user(email=email, password=password)
                user = authenticate(email=email, password=password)
                login(request, user)
                return redirect('home')
        else:
            form = RegistrationForm()
        return render(request, 'register.html', {'form': form})

في هذا المثال، قمنا بإنشاء إستمارة  RegistrationForm التي تتعامل مع التحقق من صحة الإدخال للبريد الإلكتروني وكلمة المرور للمستخدم، أما دالة العرض register التي تعرض الإستمارة وتنشئ حساب مستخدم جديد عند إرسال الإستمارة. و إذا تم التسجيل بنجاح، فسيتم تسجيل دخول المستخدم وإعادة توجيهه إلى العرض الرئيسي.

ستكون الآن قادرا على استخدام إستمارات و عروض المصادقة المدمجة في جانغو للتعامل مع تسجيل دخول و خروج المستخدم و التسجيل مستخدم جديد في مشروع جانغو.

في القسم التالي، سنتعلم كيفية تخزين كلمات المرور المجزأة في قاعدة البيانات لضمان أمان حسابات المستخدمين.

تخزين كلمات المرور المجزأة في قاعدة البيانات

لضمان أمان حسابات المستخدمين، من المهم تخزين كلمات المرور بطريقة آمنة في قاعدة البيانات. إحدى الطرق للقيام بذلك هي تجزئة كلمات المرور باستخدام دالة تجزئة التشفير قبل تخزينها في قاعدة البيانات.

التجزئة هي عملية أحادية الاتجاه تأخذ مدخلاً (في هذه الحالة، كلمة مرور) وتنتج مخرجات ذات حجم ثابت (التجزئة). تم تصميم خوارزميات التجزئة بحيث لا يمكن عكسها حسابيًا، مما يعني أنه من الصعب للغاية إعادة إنشاء كلمة المرور الأصلية من التجزئة. وهذا يزيد من صعوبة قيام المهاجم باختراق حسابات المستخدمين عن طريق الوصول إلى كلمات المرور المجزأة في قاعدة البيانات.

يوفر جانغو نظام تجزئة كلمة المرور المدمج الذي يقوم تلقائيًا بتجزئة كلمات المرور وتخزينها باستخدام خوارزمية bcrypt عند إنشاء مستخدم أو تغيير كلمة المرور الخاصة به. و لاستخدام هذا النظام، ستحتاج إلى ضبط إعداد PASSWORD_HASHERS في ملف settings.py الخاص بك ليشمل “django.contrib.auth.hashers.BCryptSHA256PasswordHasher“.

PASSWORD_HASHERS = ['django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
                    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
                    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
                    'django.contrib.auth.hashers.Argon2PasswordHasher', ]

مع تطبيق هذا الإعداد، سيقوم جانغو تلقائيًا بتجزئة كلمات مرور المستخدم وتخزينها باستخدام خوارزمية bcrypt عند إنشاء مستخدم أو تغيير كلمة المرور الخاصة به.

للتحقق مما إذا كانت كلمة مرور المستخدم صحيحة، يمكنك استخدام التابع check_password الذي يوفرها نموذج مستخدم جانغو. حيث يأخذ هذا التابع كلمة مرور كنص عادي ويقارنها بكلمة المرور المجزأة المخزنة في قاعدة البيانات. إذا تطابقت كلمات المرور، يرجع التابع True، وإلا فإنها يرجع False.

from django.contrib.auth.models import User

def check_password(email, password):
    try:
        user = User.objects.get(email=email)
        return user.check_password(password)
    except User.DoesNotExist:
        return False

من خلال تجزئة كلمات المرور وتخزينها في قاعدة البيانات، يمكنك المساعدة في ضمان أمان حسابات المستخدمين والحماية من اختراق كلمات المرور.

في الجزء الموالي، سنرى كيفية التعامل مع تسجيل الدخول و الخروج باستخدام عرض المصادقة المدمج في جانغو.

التعامل مع تسجيل الدخول والخروج باستخدام عرض مصادقة جانغو

تتضمن حزمة django.contrib.auth مجموعة من العروض المدمجة التي يمكنك استخدامها للتعامل مع تسجيل دخول و خروج المستخدم.

للتعامل مع تسجيل دخول المستخدم، يمكنك استخدام عرض  login المقدم من django.contrib.auth. بحيث يعرض إستمارة تسجيل دخول للمستخدم وتتحقق من بيانات الاعتماد الخاصة به عند إرسال الإستمارة.

لاستخدام عرض  login في قالب جانغو، يمكنك تضمين إستمارة تسجيل دخول باستخدام علامة القالب {% url %} وعلامة القالب csrf_token للحماية من هجمات تزوير طلبات المواقع المشتركة (CSRF).

<form method="post" action="{% url 'login' %}">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Log in">
</form>

في هذا المثال، قمنا بتضمين إستمارة تسجيل دخول في قالب جانغو الذي يرسل طلب POST إلى عرض  login عند إرسال الإستمارة. تحمي علامة القالب csrf_token من هجمات CSRF من خلال تضمين حقل إدخال مخفي مع كود مميز يتم فحصه بواسطة البرنامج الوسيط CSRF الخاص بـجانغو.

و للتعامل مع تسجيل خروج المستخدم، يمكنك استخدام عرض  logout المقدم من django.contrib.auth. حيث يؤدي عرض  logout إلى تدمير جلسة المستخدم وتسجيل خروجه من النظام.

لاستخدام عرض  logout في قالب جانغو، يمكنك تضمين رابط تسجيل الخروج باستخدام علامة القالب {% url %} وعلامة القالب csrf_token.

<form method="post" action="{% url 'logout' %}">
    {% csrf_token %}
    <input type="submit" value="Log out">
</form>

تخصيص تدفق مصادقة المستخدم باستخدام إشارات جانغو

تتيح لك إشارات جانغو تحديد إجراءات معينة يجب اتخاذها عند حدوث أحداث معينة في تطبيق جانغو. يمكنك استخدام إشارات Django لتخصيص تدفق مصادقة المستخدم عن طريق تحديد معالجات الإشارة المخصصة التي يتم تشغيلها عند حدوث أحداث معينة، مثل تسجيل دخول المستخدم أو خروجه.

على سبيل المثال، قد ترغب في إرسال بريد إلكتروني ترحيبي إلى مستخدم عند قيامه بالتسجيل للحصول على حساب، أو تتبع نشاط المستخدم باستخدام خدمة تحليلات تابعة لجهة خارجية. للقيام بذلك، يمكنك تحديد معالج إشارة مخصص يتم تشغيله عند إنشاء مستخدم، وإرسال البريد الإلكتروني أو تتبع الحدث من داخل معالج الإشارة. فيما يلي مثال لكيفية استخدام إشارات Django لإرسال بريد إلكتروني ترحيبي إلى المستخدم عندما يقوم بالتسجيل للحصول على حساب:

from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.core.mail import send_mail


@receiver(post_save, sender=User)
def send_welcome_email(sender, instance, created, **kwargs):
    if created:
        subject = 'Welcome to My Site!'
        message = 'Thank you for registering with My Site. We hope you enjoy using our service.'
        from_email = 'support@mysite.com'
        send_mail(subject, message, from_email, [instance.email])

في هذا المثال، قمنا بإنشاء معالج إشارة مخصص باستخدام مزخرف @receiver الذي يتم تشغيله عند إنشاء كائن مستخدم جديد. عندما يتم تشغيل الإشارة، تقوم دالة send_welcome_email بإرسال بريد إلكتروني ترحيبي إلى المستخدم باستخدام دالة send_mail.

لاستخدام معالج الإشارة في مشروع Django ستحتاج إلى تضمين عبارة import في الجزء العلوي من الكود والتأكد من إعداد نظام إشارات Django بشكل صحيح.

INSTALLED_APPS = ['django.contrib.auth',
                  'django.contrib.contenttypes',
                  'django.contrib.sessions',
                  'django.contrib.messages',
                  'django.contrib.staticfiles',
                  'django.contrib.sites',
                  'django.contrib.sitemaps',    ...]

العمل مع أذونات المستخدم والمجموعات

تتضمن حزمة django.contrib.auth دعمًا لإدارة أذونات المستخدم والمجموعات. يمكنك استخدام هذا الدعم للتحكم في الإجراءات التي يُسمح للمستخدمين بتنفيذها في تطبيق Django.

للعمل مع أذونات المستخدم والمجموعات، ستحتاج إلى إنشاء كائنات  Permission لكل إجراء تريد التحكم فيه. يرتبط كل كائن  Permission بنموذج Django وإجراء محدد (مثل الإضافة أو التغيير أو الحذف).

لإنشاء كائنات Permission في مشروع Django، يمكنك استخدام واجهة إدارة Django أو نموذج  Permission من وحدة django.contrib.auth.models.

فيما يلي مثال لكيفية إنشاء كائنات  Permission باستخدام نموذج  Permission:

from django.contrib.auth.models import Permission, Group

# Create a permission to add articles
add_article_permission = Permission.objects.create(
    codename='add_article',
    name='Can add articles',
    content_type=ContentType.objects.get_for_model(Article)
)

# Create a permission to change articles
change_article_permission = Permission.objects.create(
    codename='change_article',
    name='Can change articles',
    content_type=ContentType.objects.get_for_model(Article)
)

# Create a permission to delete articles
delete_article_permission = Permission.objects.create(
    codename='delete_article',
    name='Can delete articles',
    content_type=ContentType.objects.get_for_model(Article)
)

في هذا المثال، قمنا بإنشاء ثلاثة كائنات  Permission : واحد للسماح للمستخدمين بإضافة مقالات، وواحد للسماح للمستخدمين بتغيير المقالات، وواحد للسماح للمستخدمين بحذف المقالات. يرتبط كل كائن  Permission بنموذج  Article، مما يعني أنه يمكن تطبيقه على أي مثيل لنموذج  Article.

بمجرد إنشاء كائنات  Permission للإجراءات التي تريد التحكم فيها، يمكنك تعيينها لمستخدمين أو مجموعات من المستخدمين باستخدام كائنات  User أو  Group.

فيما يلي مثال لكيفية تعيين الأذونات لمستخدم:

from django.contrib.auth.models import User

# Get the user
user = User.objects.get(username='kader')

# Assign the add permission to the user
user.user_permissions.add(add_article_permission)

# Assign the change permission to the user
user.user_permissions.add(change_article_permission)

# Assign the delete permission to the user
user.user_permissions.add(delete_article_permission)

في هذا المثال، قمنا باسترداد كائن User للمستخدم باسم “kader” وقمنا بتعيين أذونات الإضافة والتغيير والحذف للمستخدم.

يمكنك أيضًا إنشاء كائنات Group وتعيين الأذونات لها. سيرث المستخدمون الأعضاء في المجموعة تلقائيًا الأذونات المعينة للمجموعة.

فيما يلي مثال لكيفية إنشاء مجموعة وتعيين الأذونات لها:

# Create a group
group = Group.objects.create(name='Editors')

# Assign the add permission to the group
group.permissions.add(add_article_permission)

# Assign the change permission to the group
group.permissions.add(change_article_permission)

# Assign the delete permission to the group
group.permissions.add(delete_article_permission)

# Add a user to the group
user = User.objects.get(username='kader')
group.user_set.add(user)

في هذا المثال، قمنا بإنشاء كائن  Group يسمى “Editors” وقمنا بتعيين أذونات الإضافة والتغيير والحذف للمجموعة. لقد أضفنا أيضًا المستخدم “kader” إلى المجموعة، مما يعني أنه سيرث الأذونات المخصصة للمجموعة.

أفضل الممارسات لمصادقة المستخدم الآمنة في جانغو

فيما يلي بعض أفضل الممارسات لمصادقة المستخدم الآمنة في Django:

  • استخدم دوال التحقق من صحة كلمة المرور والتجزئة المضمنة في Django لضمان تخزين كلمات المرور بشكل آمن في قاعدة البيانات.
  • استخدم حماية CSRF المدمجة في Django لمنع هجمات تزوير الطلبات عبر المواقع (CSRF).
  • استخدم SSL/TLS لتشفير الاتصال بين العميل والخادم ومنع اعتراض البيانات الحساسة.
  • استخدم حماية الجلسة المدمجة في Django لمنع اختطاف الجلسة.
  • استخدم المصادقة الثنائية (2FA) لتوفير طبقة إضافية من الأمان لحسابات المستخدمين.
  • استخدم دالة إعادة تعيين كلمة المرور المضمنة في Django للسماح للمستخدمين بإعادة تعيين كلمات المرور الخاصة بهم إذا نسوها.
  • قم بمراجعة وتحديث ممارسات المصادقة والأمان الخاصة بك بانتظام للتأكد من أنها محدثة وفعالة.

اكتشاف المزيد من بايثون العربي

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Scroll to Top

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading