فصل ۸: احراز هویت و مدیریت کاربران (Authentication & Authorization)

مقدمه
از این فصل به بعد، سایتت قراره کاربر داشته باشه. کاربر میتونه ثبتنام کنه، وارد سایت بشه و یکسری امکانات فقط مخصوص افراد خاص (یعنی فقط وقتی لاگین کردی یا مثلا ادمین فستی) نمایش داده بشه.
دوتا اصطلاح خیلی مهم داریم:
- احراز هویت (Authentication): یعنی سایت بفهمه تو واقعاً همونی که میگی هستی (مثلاً اسم و رمزت رو درست وارد کنی).
- اختیارات (Authorization): یعنی بعد از اینکه فهمیدیم تو کی هستی، مجاز هستی فلان قسمت سایت رو ببینی یا نه؟ مثلاً فقط ادمینها بتونن اخبار جدید بنویسند.
بخش 1: سیستم احراز هویت جنگو چطور کار میکند؟
جنگو خودش یک سیستم کاربری آماده داره. یعنی لازم نیست همه چی رو خودت بنویسی، فقط باید ازش استفاده کنی و اگر خواستی سفارشی سازی کنی.
تمام کاربران سایت توی یک جدول به اسم User توی دیتابیس ذخیره میشن و ما باهاش کار میکنیم.
بخش ۲: ثبت نام (Signup یا Register)
قدم اول: ساخت فرم ثبتنام
معمولاً یک فرم ساده میخوایم با فیلدهایی مثل نام کاربری، ایمیل، رمزعبور و تکرار رمزعبور.
جنگو یک فرم آماده برای ثبتنام نداره ولی فرم ساخت کاربر رو داره:
from django.contrib.auth.forms import UserCreationForm
ساخت ویو ثبتنام:
# views.py
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render, redirect
def signup(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save() # کاربر جدید میسازد
return redirect('login') # بعدش میفرستیم به صفحه لاگین
else:
form = UserCreationForm()
return render(request, 'signup.html', {'form': form})
ساخت قالب ثبتنام:
<!-- templates/signup.html -->
<h2>ثبت نام</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">ثبت نام</button>
</form>
اضافه کردن آدرس ثبتنام به urls.py
# urls.py
from . import views
urlpatterns = [
# ...
path('signup/', views.signup, name='signup'),
]
بخش ۳: ورود (Login) و خروج (Logout)
جنگو برای اینها هم ویوهای آماده داره! فقط کافیه ازشون استفاده کنی.
ورود
در urls.py اپ اصلی سایتت (معمولاً پروژه اصلی)، اضافه کن:
from django.contrib.auth import views as auth_views
urlpatterns = [
# ...
path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
]
قالب مورد نیاز:
<!-- templates/login.html -->
<h2>ورود</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">ورود</button>
</form>
خروج
در url ها اضافه کن:
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
Logout قالب لازم نداره یا میتونی خودش یک پیغام نشون بده.
بخش ۴: محدود کردن دسترسی
@login_required
خیلی وقتها فقط کسایی که لاگین کردند باید بتونند بعضی صفحات رو ببینند. مثلاً صفحه پروفایل.
برای این کار دکوریتور login_required استفاده میکنیم:
from django.contrib.auth.decorators import login_required
@login_required
def profile(request):
# فقط کاربر لاگین شده به این دسترسی داره
return render(request, 'profile.html')
اگر کاربر لاگین نکرده باشه، اتوماتیک میره به صفحه لاگین.
باید توی تنظیمات پروژه، مسیر صفحه لاگین رو معرفی کنی:
# settings.py
LOGIN_URL = 'login'
بخش ۵: مدیریت سطوح دسترسی (Authorization)
سه سطح دسترسی مهم داریم:
- کاربر عادی (Authenticated User)
- مدیر (staff / admin)
- superuser
مثلاً فقط ادمینها بتونند یکسری صفحات رو ببینند.
فقط ادمینها
from django.contrib.admin.views.decorators import staff_member_required
@staff_member_required
def special_view(request):
# فقط مدیرها این رو میبینند
...
یا حتی یک سطح بالاتر:
from django.contrib.auth.decorators import user_passes_test
def superuser_required(view_func):
decorated_view_func = user_passes_test(lambda u: u.is_superuser)(view_func)
return decorated_view_func
نمونه استفاده:
@superuser_required
def only_for_superuser(request):
...
بخش ۶: نمایش اطلاعات کاربر و کار با مدل User
اگر خواستی اطلاعات کاربر رو ببینی (مثلاً توی ویو یا قالب)، میتونی این شکلی کار کنی:
if request.user.is_authenticated:
username = request.user.username
email = request.user.email
در قالبها:
{{ user.username }}
{{ user.is_authenticated }}
بخش ۷: امکانات تکمیلی
ویرایش پسورد و فراموشی رمز
جنگو برای اینها هم ویو آماده داره، مثل:
# urls.py
path('password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'),
path('password_change/', auth_views.PasswordChangeView.as_view(), name='password_change'),
(برای اینها قالبهایی هم باید بسازی.)
خلاصه و نکات مهم
- جنگو سیستم احراز هویت و مجوزهای کاربری آماده و قدرتمند داره.
- ثبتنام دستی باید بسازی (با فرم آماده جنگو)، اما ورود و خروج ویو آماده داره.
- با دکوریتورهای مخصوص میتونی دسترسی رو محدود کنی.
- با
request.userبه کاربر فعلی دسترسی داری.
تمرین
- یک فرم ثبتنام درست کن و کاربران جدید بساز.
- صفحه پروفایل بساز و فقط برای کاربران لاگین شده قابل نمایش باشه.
- صفحهای بساز مخصوص ادمینها.