فصل ۶: ادمین، احراز هویت و دسترسی

احراز هویت: login، logout، تغییر و بازیابی رمز

احراز هویت آماده، فقط قالب لازم دارد

اپ django.contrib.auth همه‌ی Viewهای ورود و خروج و مدیریت رمز را آماده دارد. کافی است urlهای آن را include کنید و قالب‌هایش را بسازید. به لطف Custom User فصل اول، فرم ورود خودش برچسب «موبایل» را به‌جای «نام کاربری» نشان می‌دهد، چون از USERNAME_FIELD می‌خواند.

# config/urls.py
urlpatterns += [path("accounts/", include("django.contrib.auth.urls"))]

# settings.py
LOGIN_URL = "login"
LOGIN_REDIRECT_URL = "orders:list"
LOGOUT_REDIRECT_URL = "pages:home"
SESSION_COOKIE_AGE = 60 * 60 * 24 * 14        # دو هفته
PASSWORD_HASHERS = [
    "django.contrib.auth.hashers.Argon2PasswordHasher",   # pip install argon2-cffi
    "django.contrib.auth.hashers.PBKDF2PasswordHasher",
]
نام urlآدرسقالب
loginaccounts/login/registration/login.html
logoutaccounts/logout/ (فقط POST)registration/logged_out.html
password_changeaccounts/password_change/registration/password_change_form.html
password_resetaccounts/password_reset/registration/password_reset_form.html
password_reset_confirmaccounts/reset/<uidb64>/<token>/registration/password_reset_confirm.html

قالب ورود و دکمه‌ی خروج

{# templates/registration/login.html #}
{% extends "base.html" %}
{% block content %}
<form method="post">
  {% csrf_token %}
  {{ form.as_div }}
  <input type="hidden" name="next" value="{{ next }}">
  <button type="submit">ورود</button>
</form>
{% endblock %}

{# در navbar: خروج از Django 5.0 فقط با POST #}
<form method="post" action="{% url 'logout' %}">
  {% csrf_token %}
  <button type="submit">خروج</button>
</form>

ورود و خروج دستی در کد

from django.contrib.auth import authenticate, login, update_session_auth_hash

user = authenticate(request, mobile="09121234567", password="...")   # یا username=
if user is not None:
    login(request, user)

# بعد از تغییر رمز توسط خود کاربر، تا از Session خارج نشود:
update_session_auth_hash(request, user)

بازیابی رمز پیش‌فرض جنگو با ایمیل کار می‌کند. اگر کاربران شما فقط موبایل دارند، بازیابی را با کد پیامکی (درس ۳۰) بسازید.

نکته‌هایی که کمتر کسی می‌داند

  • از Django 5.0 خروج با GET حذف شده است؛ لینک ساده‌ی <a href="/accounts/logout/"> خطای 405 می‌دهد و باید فرم POST با توکن CSRF باشد.
  • Django 5.1 میدل‌ور LoginRequiredMiddleware را آورد: همه‌ی صفحات به‌طور پیش‌فرض لاگین می‌خواهند و صفحات عمومی را با دکوراتور @login_not_required باز می‌کنید؛ برای پنل‌های داخلی امن‌ترین پیش‌فرض است.
  • LoginView پارامتر next را با url_has_allowed_host_and_scheme بررسی می‌کند تا ریدایرکت به سایت مهاجم (open redirect) ممکن نباشد؛ اگر ورود دستی می‌نویسید، همین تابع را خودتان صدا بزنید.
  • login() شناسه‌ی Session را عوض می‌کند (جلوگیری از session fixation) اما داده‌های Session مهمان مثل سبد خرید را نگه می‌دارد.
  • فهرست PASSWORD_HASHERS را که عوض کنید، رمز کاربران قدیمی در اولین ورود موفق خودکار با الگوریتم جدید دوباره هش می‌شود؛ مهاجرت بی‌دردسر به Argon2.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.