مدل کاربر جنگو: چیست، نحوه استفاده از آن و موارد دیگر

جنگو کاربر مدل ارائه می دهد پایه ای محکم برای مدیریت کاربران، ایمن سازی محتوا و کنترل دسترسی به برنامه های کاربردی وب شما. با توسعه پروژه‌های پویا و پیچیده‌تر با جنگو، این مدل‌ها شما را قادر می‌سازند تا احراز هویت و مجوز کاربر را به طور موثر و ایمن پیاده‌سازی کنید.

در این مقاله، جنگو را توضیح خواهیم داد کاربر مدل است، چگونه آن را تنظیم کنید، و چگونه آن را مطابق با نیازهای خود سفارشی کنید. همچنین در مورد مجوزهای کاربر و مجوز برای ارائه امنیت قوی برنامه بحث خواهیم کرد.

مدل Django User چیست؟

سیستم احراز هویت داخلی جنگو مدیریت کاربر را با ویژگی هایی مانند ورود به سیستم، خروج از سیستم و مدیریت رمز عبور ساده می کند.

به طور پیش فرض، جنگو a را ارائه می دهد کاربر نماهای مدل و احراز هویت که اکثر این وظایف را خارج از جعبه انجام می دهند. برای ثبت نام کاربر، می توانید عملکردهای سفارشی را متناسب با نیازهای برنامه خود اضافه کنید.

با استفاده از مدل پیش فرض کاربر جنگو

انتخاب پیش فرض کاربر مدل سازی روی یک سفارشی می تواند سرعت توسعه را افزایش دهد، زیرا ویژگی های آماده ای مانند احراز هویت، مجوزها و مدیریت رمز عبور را بدون نیاز به تنظیمات اضافی ارائه می دهد.

این باعث می‌شود که برای پروژه‌هایی با نیازهای ساده کاربر، انتخابی عالی باشد.

مروری بر ویژگی های احراز هویت کاربر

جنگو پیش فرض کاربر مدل شامل ویژگی‌های ضروری برای احراز هویت و مدیریت کاربر، مانند فیلدهایی برای نام کاربری، رمز عبور، ایمیل و مجوزها (مانند is_staff و is_superuser پرچم ها).

این روش‌های داخلی را برای هش رمز عبور ارائه می‌کند و با چارچوب احراز هویت جنگو برای کنترل ورود، خروج و کنترل دسترسی یکپارچه می‌شود. همراه با مجوزها و چارچوب های جلسه، مدیریت جلسات و نقش های کاربر را به صورت ایمن ساده می کند.

ورود و خروج کاربر را تنظیم کنید

نماهای داخلی جنگو در django.contrib.auth.views اجرای عملکرد ورود و خروج را آسان می کند. را LoginView و LogoutView احراز هویت را اداره کنید process، کاهش نیاز به کد سفارشی و ساده سازی این عملیات.

  1. URL ها را برای ورود و خروج تنظیم کنید

خود را ویرایش کنید آدرس های اینترنتیpy فایل:

from django.urls import path
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(), name="login"),
    path('logout/', auth_views.LogoutView.as_view(), name="logout"),
]

الگوی URL /ورود/ به نقشه برداری می شود LoginView، که با نمایش فرم ورود به سیستم و پردازش احراز هویت، ورود کاربر را کنترل می کند.

در همین حال، /خروج/ به نقشه برداری می شود LogoutView، که کاربر را از سیستم خارج می کند، جلسه را پاک می کند و آنها را به قسمت مشخص شده هدایت می کند page.

  1. یک قالب فرم ورود ایجاد کنید

شما می توانید یک الگوی ورود ساده ایجاد کنید (login.html) در داخل برنامه شما قالب ها دایرکتوری:

<form method="post" action="https://www.hostinger.com/tutorials/{% url"login' %}">
    {% csrf_token %}
    <div>
        <label for="username">Username:</label>
        <input type="text" id="username" name="username" required>
    </div>
    <div>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password" required>
    </div>
    {% if form.non_field_errors %}
        <div class="error">
            {{ form.non_field_errors }}
        </div>
    {% endif %}
    <button type="submit">Login</button>
</form>

این الگو به عنوان یک رابط کاربری برای ارسال اعتبار ورود به سیستم عمل می کند. هنگامی که با Django داخلی جفت می شود LoginView، نام کاربری و رمز عبور را برای احراز هویت کاربر پردازش می کند.

  1. خروج از سیستم را ایجاد کنید

به عنوان جنگو، برای خروج از سیستم نیازی به قالب جداگانه ندارید LogoutView به طور خودکار آن را مدیریت می کند. این جلسه کاربر را پاک می کند و به آن هدایت می شود page تعریف شده در LOGOUT_REDIRECT_URL تنظیم، یا مشخص شده است next_page.

برای انجام این کار، به سادگی پیوند خروج را در قالب خود اضافه کنید:

<a href="https://www.hostinger.com/tutorials/{% url"logout' %}">Logout</a>

با UserCreationForm ثبت نام کاربری ایجاد کنید

جنگو به طور پیش‌فرض یک نمای ثبت داخلی ارائه نمی‌کند، اما می‌توانید با استفاده از آن یکی ایجاد کنید UserCreationForm. این فرم جنگو، ارائه شده در django.contrib.auth.forms، شامل فیلدهایی برای نام کاربری، رمز عبور 1، و رمز عبور 2، و اعتبارسنجی را برای ایجاد یک کاربر جدید مدیریت می کند.

  1. یک نمای ثبت نام ایجاد کنید

در شما دیدگاه هاpy فایل، اضافه کنید:

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

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            messages.success(request, "Registration successful. Welcome!")
            return redirect('home')
        else:
            messages.error(request, "Registration failed. Please check the form for errors.")
    else:
        form = UserCreationForm()
    return render(request, 'register.html', {'form': form})
  1. URL را برای ثبت نام تنظیم کنید
پیشنهاد می‌کنیم بخوانید:  روش نصب وردپرس روی زیر دامنه: 2 روش اثبات شده

این خطوط را وارد کنید آدرس های اینترنتیpy:

from django.urls import path
from . import views  # Import your views module

urlpatterns = [
    path('register/', views.register, name="register"),
]
  1. قالب فرم ثبت نام را ایجاد کنید

برای register.html فایل، شامل:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Register</button>
</form>

این الگو یک فرم ساده ارائه شده از جنگو را نمایش می دهد UserCreationForm. هنگامی که با نمای ثبت نام جفت می شود، به کاربران امکان می دهد یک حساب کاربری ایجاد کنند.

پس از ثبت نام موفقیت آمیز، اگر نمای شامل یک مرحله ورود به سیستم باشد، کاربران به طور خودکار وارد سیستم شده و به قسمت مشخص شده هدایت می شوند. page.

جلسات کاربر را مدیریت کنید

هنگامی که کاربران وارد سیستم شدند، جلسات خود را برای حفظ امنیت و اطمینان از تجربه کاربری روان مدیریت کنید.

جنگو از چارچوب جلسه برای ذخیره داده های مربوط به جلسه هر کاربر استفاده می کند روی سرور این شامل اینکه آیا کاربر وارد شده است، وضعیت احراز هویت او و هر داده جلسه اضافی که انتخاب می کنید ذخیره شود، می شود.

  1. دسترسی و اصلاح داده های جلسه

ذخیره، بازیابی و حذف داده‌های جلسه در نماهای جنگو با استفاده از شی دیکشنری مانند request.session:

from django.shortcuts import render

def user_dashboard(request):
    # Store data in session
    request.session['welcome_message'] = 'Welcome back!'
    
    # Retrieve data from session
    welcome_message = request.session.get('welcome_message', 'Hello, User!')

    # Remove data from session
    if 'welcome_message' in request.session:
        del request.session['welcome_message']

    return render(request, 'dashboard.html', {'message': welcome_message})
  1. داده های جلسه را سفارشی کنید

رفتار جلسه را با پیکربندی تنظیمات زیر در آن کنترل کنید تنظیماتpy:

  • SESSION_COOKIE_AGE – مدت زمان یک جلسه را تعیین می کند. به طور پیش فرض، این است 1209600 ثانیه یا 2 هفته ها
  • SESSION_EXPIRE_AT_BROWSER_CLOSE – اگر روی تنظیم شود درست است، هنگامی که کاربر مرورگر را ببندد، جلسات منقضی می شوند.
  • SESSION_ENGINE – قسمت پشتیبان جلسه مانند پایگاه داده، کش یا مبتنی بر فایل را مشخص می کند.
# settings.py
SESSION_COOKIE_AGE = 3600  # Sessions expire after 1 hour
SESSION_EXPIRE_AT_BROWSER_CLOSE = True  # Sessions expire روی browser close
SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # Use database for sessions
  1. وضعیت احراز هویت را بررسی کنید

تعیین کنید که آیا کاربر با استفاده از سیستم وارد شده است یا خیر request.user.is_authenticated، برای محافظت از نماها یا نمایش محتوای شخصی شده مفید است:

from django.shortcuts import redirect

def protected_view(request):
    if not request.user.is_authenticated:
        return redirect('login')  # Redirect to login if not authenticated
    return render(request, 'protected_page.html')
  1. یک جلسه را تمام کنید

کاربران را از سیستم خارج کنید و داده های جلسه آنها را با استفاده از خروج تابع:

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

def logout_view(request):
    logout(request)  # Logs out the user and clears session data
    return redirect('login')  # Redirect to login page

سفارشی کردن مدل کاربر جنگو

در برخی موارد، جنگو پیش‌فرض است کاربر مدل ممکن است تمام الزامات برنامه شما را برآورده نکند. سفارشی کردن مدل کاربر به شما امکان می دهد فیلدهایی را اضافه کنید، رفتار احراز هویت را تغییر دهید یا آن را جایگزین کنید کاربر به طور کامل با یک مدل متناسب با نیازهای شما.

AbstractBaseUser در مقابل AbstractUser

هنگام سفارشی کردن مدل کاربر، دو گزینه اصلی دارید: گسترش از AbstractBaseUser یا AbstractUser.

AbstractBaseUser حداقل امکانات را فراهم می کند: ویژگی های هش رمز عبور و احراز هویت. این به شما کنترل کامل برای تعریف همه زمینه ها و رفتارها از جمله نام کاربری، ایمیل، یا هر داده اضافی که نیاز دارید.

با این حال، شما را ملزم به پیاده سازی فیلدها و روش هایی مانند USERNAME_FIELD، فعال است، و اشیاء.

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

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('Email address is required')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

class CustomUser(AbstractBaseUser):
    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)

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

    objects = CustomUserManager()

AbstractUser ارث می برد از AbstractBaseUser و شامل تمام فیلدها و متدهای مدل پیش فرض User، مانند نام کاربری، ایمیل، first_name، و نام خانوادگی. اگر فقط نیاز به اضافه کردن فیلدهای اضافی یا کمی تغییر رفتار موجود بدون بازنویسی کل مدل دارید، ایده آل است.

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    age = models.PositiveIntegerField(null=True, blank=True)

یک مدل کاربر سفارشی ایجاد کنید

برای تعریف یک مدل کاربر سفارشی، مراحل زیر را دنبال کنید:

  1. یک مدل کاربر سفارشی را تعریف کنید که از AbstractBaseUser یا AbstractUser.
  2. مدل کاربر سفارشی خود را در آن مشخص کنید تنظیماتpy:
AUTH_USER_MODEL = 'myapp.CustomUser'
  1. مدل‌های کاربر سفارشی برای مدیریت ایجاد کاربر به یک مدیر سفارشی نیاز دارند، create_user و create_superuser.
  2. استفاده کنید UserCreationForm و UserChangeForm از django.contrib.auth.forms به عنوان پایه ای برای ایجاد فرم های سازگار با مدل کاربر سفارشی شما:
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ['email', 'first_name', 'last_name']

class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = CustomUser
        fields = ['email', 'first_name', 'last_name']

به یک مدل کاربر سفارشی در یک پروژه موجود مهاجرت کنید

تغییر به یک مدل کاربر سفارشی در یک پروژه موجود می تواند چالش برانگیز باشد، زیرا سیستم احراز هویت جنگو به شدت با پیش فرض ادغام می شود. کاربر مدل در اینجا مراحل انجام می شود:

  1. برای جلوگیری از از دست رفتن داده ها در حین انتقال، از پایگاه داده خود نسخه پشتیبان تهیه کنید.
  2. مدل دلخواه خود را تعریف کرده و آن را به روز کنید AUTH_USER_MODEL تنظیم در تنظیماتpy.
  3. اگر پروژه از قبل دارای یک کاربر مدل و داده های مرتبط، باید مهاجرت را مدیریت کنید process با دقت:
    • یک اسکریپت انتقال داده برای کپی کردن داده ها از نسخه قدیمی ایجاد کنید auth.User مدل کاربر سفارشی جدید شما.
    • استفاده کنید مهاجرت ها و مهاجرت کنید دستورات اعمال تغییرات
  4. هر مدل، نما، یا فرمی را که به پیش فرض ارجاع می دهد، به روز کنید کاربر مدل برای اشاره به مدل سفارشی شما با استفاده از get_user_model():
from django.contrib.auth import get_user_model

User = get_user_model()
  1. تمام ویژگی های احراز هویت، از جمله ورود به سیستم، خروج از سیستم و بازنشانی رمز عبور را به طور کامل آزمایش کنید. مطمئن شوید که آنها به طور یکپارچه با مدل کاربر جدید کار می کنند.
پیشنهاد می‌کنیم بخوانید:  بایگانی VPS

مدیریت مجوزها و مجوزهای کاربر

جنگو به شما امکان می دهد مجوزهای مختلفی را به کاربران و گروه ها اختصاص دهید و کنترل دسترسی مبتنی بر نقش را فعال می کند.

مجوز کاربر را با مجوزهای داخلی جنگو کنترل کنید

می‌توانید مجوزهایی را به مدل‌ها یا گروه‌های کاربر اختصاص دهید و برای کنترل دسترسی به اقدامات خاص و تعیین نقش‌های آنها، نماهای خود را بررسی کنید.

به عنوان مثال، یک مدیر ممکن است مجوزهایی برای افزودن یا حذف محتوا داشته باشد، در حالی که کاربران عادی فقط می توانند محتوا را مشاهده کنند.

محدود کردن نماها بر اساس روی مجوزها

می‌توانید با بررسی اینکه آیا کاربر مجوزهای لازم را با استفاده از Django دارد، دسترسی به برخی نماها را محدود کنید @permission_required دکوراتور به عنوان مثال:

from django.contrib.auth.decorators import permission_required

@permission_required('app.add_article')
def add_article(request):
    # View code for adding an article

فقط کاربران با add_article مجوز قادر به دسترسی به این نما خواهد بود.

کنترل دسترسی مبتنی بر نقش (RBAC) را با گروه ها اجرا کنید

جانگو گروه این ویژگی به شما امکان می دهد کنترل دسترسی مبتنی بر نقش را با ایجاد نقش هایی مانند ویرایشگر یا بیننده و ارتباط کاربران با این گروه ها پیاده سازی کنید. شما می توانید به گروه ها مجوزهای خاصی بدهید که همه اعضای آنها به طور خودکار به ارث می برند.

  1. کاربران را به گروه ها اختصاص دهید

برای اختصاص دادن یک کاربر به یک گروه از طریق برنامه، از گروه و کاربر مدل هایی که در زیر نشان داده شده است:

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

# Retrieve the group and user
group = Group.objects.get(name="editors")
user = User.objects.get(username="john")

# Assign the user to the group
user.groups.add(group)

اگر گروه وجود ندارد، می توانید آن را به صورت برنامه نویسی ایجاد کنید:

group, created = Group.objects.get_or_create(name="editors")
  1. عضویت گروه را در نماها بررسی کنید

شما می توانید بازدیدها را بر اساس محدود کنید روی عضویت در گروه با استفاده از @user_passes_test دکوراتور مثال زیر روش محدود کردن دسترسی به یک نما را برای کاربران در نمایه نشان می دهد سردبیران گروه:

from django.contrib.auth.decorators import user_passes_test
from django.shortcuts import render

# Define a test function to check group membership
def is_editor(user):
    return user.groups.filter(name="editors").exists()

# Restrict access to the editor_dashboard view
@user_passes_test(is_editor, login_url="/login/")  # Redirect unauthorized users to login
def editor_dashboard(request):
    return render(request, 'editor_dashboard.html')

در این مثال، فقط کاربرانی که متعلق به سردبیران گروه می تواند به editor_dashboard مشاهده کنید. کاربران غیر مجاز به لاگین هدایت می شوند page (/ورود/)، اما می توانید در صورت نیاز این URL را سفارشی کنید.

کار با بک‌اندهای احراز هویت جنگو

پشتیبان‌های احراز هویت در جنگو تعیین می‌کنند که کاربران چگونه احراز هویت می‌شوند و چگونه مجوزها بازیابی می‌شوند. به طور پیش فرض، جنگو از ModelBackend، که در برابر آن احراز هویت می شود کاربر مدل و مجوزهای ذخیره شده در پایگاه داده را بررسی می کند.

یک باطن احراز هویت سفارشی ایجاد کنید

می‌توانید یک پشتیبان احراز هویت سفارشی برای پیاده‌سازی روش‌های ورود جایگزین، مانند احراز هویت مبتنی بر ایمیل یا خدمات شخص ثالث ایجاد کنید. یک backend سفارشی باید حداقل دو روش را تعریف کند:

  • احراز هویت (خود، درخواست، ** اعتبار)
  • get_user (خود، user_id)

در اینجا مثالی از ایجاد یک backend سفارشی برای اجازه ورود با آدرس ایمیل آورده شده است:

from django.contrib.auth.models import User

class EmailBackend:
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = User.objects.get(email=username)  # Authenticate using email
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

این باطن را به خود اضافه کنید AUTHENTICATION_BACKENDS تنظیم:

AUTHENTICATION_BACKENDS = [
    'myapp.backends.EmailBackend',
    'django.contrib.auth.backends.ModelBackend',  # Fallback to username authentication
]

با مجوزها در backend های سفارشی کار کنید

بک‌اندهای سفارشی همچنین می‌توانند روش بازیابی مجوزها برای کاربران را با لغو تعریف کنند has_perm، has_module_perms، یا روش های مشابه به عنوان مثال:

def has_perm(self, user, perm, obj=None):
    # Custom permission logic
    return True  # Grant all permissions for demonstration purposes

اشکال زدایی مشکلات احراز هویت

جنگو از پشتیبان‌های احراز هویت چندگانه پشتیبانی می‌کند که در قسمت نشان داده شده است AUTHENTICATION_BACKENDS قطعه با این حال، ممکن است هنگام استفاده از پشتیبان های متعدد، مشکلاتی پیدا کنید. برای رفع اشکال:

  • گزارش‌ها را بررسی کنید تا ببینید کدام باطن فراخوانی می‌شود.
  • استفاده کنید django.contrib.auth.authenticate() به صورت دستی در پوسته برای آزمایش اعتبار:
from django.contrib.auth import authenticate
user = authenticate(username="john@example.com", password='securepassword')
print(user)

نتیجه گیری

درک و سفارشی سازی جنگو کاربر مدل برای ساخت سیستم های احراز هویت قوی مهم است. جنگو با ابزارهای انعطاف‌پذیر برای ایجاد مدل‌های کاربر سفارشی، مدیریت جلسات، مجوزها و پشتیبان‌های احراز هویت، از نیازهای متنوع پشتیبانی می‌کند.

می‌توانید کنترل دسترسی مبتنی بر نقش را پیاده‌سازی کنید، نماها را محدود کنید و روش‌های احراز هویت را برای ارائه تجربه‌ای امن و کاربرپسند تنظیم کنید. تسلط بر این ویژگی ها به شما امکان می دهد تا کاربران را با اطمینان در هر برنامه جنگو مدیریت کنید.

سوالات متداول مدل های کاربر جنگو

چگونه یک مدل کاربر سفارشی در جنگو ایجاد کنم؟

برای ایجاد یک مدل کاربر سفارشی در جنگو، کلاس فرعی AbstractUser یا AbstractBaseUser، فیلدهای دلخواه را اضافه کرده و تنظیم کنید AUTH_USER_MODEL در تنظیماتpy. برای جلوگیری از درگیری، این کار را قبل از مهاجرت اولیه انجام دهید. این تنظیمات به ویژگی های کاربر سفارشی و احراز هویت انعطاف پذیر اجازه می دهد.

چه فیلدهایی در مدل پیش فرض کاربر جنگو گنجانده شده است؟

جنگو پیش فرض کاربر مدل شامل نام کاربری، رمز عبور، ایمیل، first_name، و نام خانوادگی برای اطلاعات اولیه کاربر؛ is_staff، فعال است، و is_superuser برای مدیریت نقش؛ و last_login و date_joined برای پیگیری فعالیت

چگونه می توانم مدل کاربر پیش فرض را گسترش دهم؟

پیش فرض جنگو را گسترش دهید کاربر با ایجاد یک مدل جدید با a OneToOneField (کاربر). فیلدهای سفارشی را در این مدل برای ذخیره داده های اضافی اضافه کنید، مدل کاربر اصلی را دست نخورده نگه دارید و در عین حال امکان دسترسی به ویژگی های توسعه یافته را از طریق نمونه کاربر فراهم کنید.