Django Authentication (පරිශීලක කළමනාකරණය) - Complete Sinhala Guide

Django Authentication (පරිශීලක කළමනාකරණය) - Complete Sinhala Guide

ආයුබෝවන් යාළුවනේ! අද අපි කතා කරන්න යන්නේ වෙබ් ඇප්ලිකේෂන් එකක වැදගත්ම කොටසක් ගැන – ඒ තමයි User Authentication. සරලවම කිව්වොත්, ඔයාගේ වෙබ්සයිට් එකට එන කෙනා කවුද කියලා හඳුනාගෙන, එයාට මොනවද කරන්න පුළුවන්, මොනවද බැරි කියලා තීරණය කරන එක තමයි මේකෙන් කරන්නේ. Django වගේ powerhouse framework එකක් පාවිච්චි කරනකොට මේ වැඩේ කොච්චර ලේසිද කියලා අපි බලමු. මේ tutorial එකෙන්, Django වල built-in authentication system එක කොහොමද වැඩ කරන්නේ කියලා ඉගෙන ගන්නවා විතරක් නෙවෙයි, user registration, login, logout වගේ දේවල් practical විදියට කොහොමද implement කරන්නේ කියලා පියවරෙන් පියවර බලමු. එහෙනම්, අපි පටන් ගමු!

Django වල Authentication System එක

ඕනෑම වෙබ් ඇප්ලිකේෂන් එකක ආරක්ෂාවටයි, පරිශීලක අත්දැකීම (User Experience) හොඳ කරන්නයි authentication කියන එක අත්‍යවශ්‍යයි. සරලවම කිව්වොත්, authentication කියන්නේ පරිශීලකයෙක් (User) ඇත්තටම එයා කියන කෙනාමද කියලා තහවුරු කරගන්න එක. Django වල මේකට built-in, හොඳට secure කරපු authentication system එකක් තියෙනවා. ඒක පාවිච්චි කරලා අපිට බොහොම පහසුවෙන් පරිශීලකයන් (Users) කළමනාකරණය කරන්න පුළුවන්.

මේ system එකට ප්‍රධාන කොටස් කීපයක් අන්තර්ගතයි:

  • User Model: Django වල built-in User model එකක් තියෙනවා, ඒකෙන් username, password, email, first_name, last_name වගේ දේවල් handle කරනවා.
  • Authentication Backends: පරිශීලකයෙක් (User) authenticate කරන්නේ කොහොමද කියලා මේ backends වලින් තීරණය කරනවා (උදාහරණයක් විදියට username සහ password වලින්).
  • Views සහ Forms: Login, Logout, Password reset වගේ දේවලට අදාල views සහ forms Django එකේම තියෙනවා.
  • Session Management: User කෙනෙක් login වුණාම එයාගේ session එක manage කරනවා, ඒකෙන් තමයි User එක site එකේ authenticated විදියට තියාගන්නේ.
  • Password Hashing: Passwords database එකේ save කරන්නේ hashed කරලා, ඒක ආරක්ෂාවට ගොඩක් වැදගත්. Django මේක ඔටෝ කරලා දෙනවා.

මුලින්ම සකසා ගැනීම (Initial Setup)

Django project එකක් හදනකොට authentication system එක default විදියටම configure වෙලා තියෙන්නේ. ඒත් ඒක වැඩ කරන්න migrations ටික run කරන්න ඕනේ.

python manage.py migrate

මේ command එකෙන් User model එකටයි, permissions වලටයි අවශ්‍ය database tables ටික හදනවා.

පරිශීලක ලියාපදිංචිය (User Registration)

අලුත් පරිශීලකයන් (Users) site එකට ලියාපදිංචි කරගන්න එක තමයි පළවෙනි පියවර. මේකට Django වල built-in UserCreationForm එක පාවිච්චි කරන්න පුළුවන්. මේකෙන් අපිට User කෙනෙක්ට username එකයි, password එක දෙපාරකුයි enter කරන්න පුළුවන් form එකක් හදාගන්න පුළුවන්.

1. forms.py හදමු

මුලින්ම ඔයාගේ app එක ඇතුළේ forms.py කියලා file එකක් හදලා මේ code එක දාගන්න. (උදා: myapp/forms.py)

from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django.contrib.auth import get_user_model

class CustomUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm.Meta):
        model = get_user_model() # Or your custom User model if you have one
        fields = UserCreationForm.Meta.fields + ('email',) # Add email if you want

class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = get_user_model()
        fields = UserChangeForm.Meta.fields

මෙහිදී අපි UserCreationForm එක extend කරලා email field එකත් එකතු කළා. get_user_model() කියන්නේ Django වල default User model එක නැත්නම් ඔයා custom User model එකක් පාවිච්චි කරනවා නම් ඒක return කරන function එක.

2. views.py එකේ registration view එක හදමු

දැන් views.py එකේ registration logic එක ලියමු.

from django.shortcuts import render, redirect
from django.contrib.auth import login
from .forms import CustomUserCreationForm # අපි හදාගත්තු form එක import කරගන්නවා

def signup_view(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user) # User register වුණාට පස්සේ login කරනවා
            return redirect('home') # 'home' කියන්නේ ඔයාගේ main page එකේ URL name එක
    else:
        form = CustomUserCreationForm()
    return render(request, 'registration/signup.html', {'form': form})

3. urls.py එකේ URL එක map කරමු

registration view එකට URL එකක් දෙන්න ඕනේ. ඔයාගේ app එකේ urls.py එකේ මෙහෙම එකතු කරන්න.

from django.urls import path
from . import views

urlpatterns = [
    path('signup/', views.signup_view, name='signup'),
    # ... අනිකුත් URLs
]

අනික project එකේ urls.py එකේ ඔයාගේ app එකේ URLs ටික include කරන්න අමතක කරන්න එපා.

# myproject/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('django.contrib.auth.urls')), # Built-in auth URLs
    path('', include('myapp.urls')), # ඔයාගේ app එකේ URLs
]

django.contrib.auth.urls කියන්නේ login, logout, password reset වගේ දේවල් වලට Django දීලා තියෙන built-in URLs.

4. signup.html Template එක හදමු

සාමාන්‍යයෙන් registration templates තියෙන්නේ templates/registration/ කියන folder එක ඇතුළේ. ඔයාට වෙන folder එකක දාන්නත් පුළුවන්, හැබැයි ඒකට template_name එක හරියට specify කරන්න ඕනේ.

<!-- templates/registration/signup.html -->
<h2>අලුත් ගිණුමක් සාදන්න</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">ලියාපදිංචි වන්න</button>
</form>
<p>ගිණුමක් තියෙනවද? <a href="{% url 'login' %}">ඇතුල් වෙන්න</a>.</p>

{% csrf_token %} කියන එක ආරක්ෂාවට අත්‍යවශ්‍යයි, ඒක form එකක් ඇතුළේ අනිවාර්යයෙන්ම දාන්න ඕනේ. {{ form.as_p }} එකෙන් form එකේ fields ටික paragraph tags ඇතුළේ render කරනවා.

ඇතුල්වීම සහ පිටවීම (Login and Logout)

Django වල authentication system එකේ login සහ logout වලටත් built-in views තියෙනවා. ඒක අපිට ගොඩක් වෙලාව ඉතුරු කරනවා.

Login View එක

login කරන්න LoginView එක පාවිච්චි කරන්න පුළුවන්.

# myproject/urls.py හෝ ඔයාගේ app එකේ urls.py
from django.contrib.auth import views as auth_views

urlpatterns = [
    # ...
    path('login/', auth_views.LoginView.as_view(template_name='registration/login.html'), name='login'),
    # ...
]

template_name එකෙන් කියන්නේ login form එකට පෙන්වන්න ඕනේ template එක මොකක්ද කියලා. අපි templates/registration/login.html කියන path එකේ file එක හදාගමු.

<!-- templates/registration/login.html -->
<h2>ඇතුල් වන්න</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">ඇතුල් වන්න</button>
</form>
<p>ගිණුමක් නැද්ද? <a href="{% url 'signup' %}">ලියාපදිංචි වන්න</a>.</p>

Login වුණාට පස්සේ User කෙනෙක්ව යවන්න ඕනේ page එක settings.py එකේ LOGIN_REDIRECT_URL එකෙන් specify කරන්න පුළුවන්.

# myproject/settings.py
LOGIN_REDIRECT_URL = '/' # Home page එකට redirect කරනවා
LOGOUT_REDIRECT_URL = '/' # Logout වුණාට පස්සේ redirect කරන page එක

Logout View එක

logout කරන්න LogoutView එක පාවිච්චි කරන්න පුළුවන්.

# myproject/urls.py හෝ ඔයාගේ app එකේ urls.py
from django.contrib.auth import views as auth_views

urlpatterns = [
    # ...
    path('logout/', auth_views.LogoutView.as_view(next_page='/'), name='logout'),
    # ...
]

next_page එකෙන් කියන්නේ User එක logout වුණාට පස්සේ යවන්න ඕනේ URL එක. අපි home page එකට යොමු කරලා තියෙනවා. Logout view එකට template එකක් අවශ්‍ය වෙන්නේ නැහැ, නමුත් next_page එකක් නැත්නම් logout confirmation page එකක් render කරයි. සාමාන්‍යයෙන් කෙලින්ම redirect කරන එක තමයි කරන්නේ.

Views වලට පිවිසීම සීමා කිරීම (Restricting Access to Views)

ඔයාගේ web application එකේ සමහර pages වලට access දෙන්න ඕනේ login වෙලා ඉන්න users ලට විතරයි. මේකට Django වල පහසු ක්‍රම දෙකක් තියෙනවා:

1. @login_required Decorator එක

Function-based views වලට access සීමා කරන්න මේ decorator එක පාවිච්චි කරන්න පුළුවන්.

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

@login_required
def profile_view(request):
    return render(request, 'profile.html', {'user': request.user})

මේ decorator එක දාපුවාම, User කෙනෙක් login වෙලා නැත්නම්, එයාව settings.py එකේ LOGIN_URL එකට redirect කරනවා.

# myproject/settings.py
LOGIN_URL = '/login/' # මේ URL එකට තමයි login වෙලා නැති අයව යොමු කරන්නේ

2. LoginRequiredMixin එක (Class-based views වලට)

Class-based views වලට නම් LoginRequiredMixin එක පාවිච්චි කරන්න පුළුවන්.

from django.views.generic import TemplateView
from django.contrib.auth.mixins import LoginRequiredMixin

class ProfilePageView(LoginRequiredMixin, TemplateView):
    template_name = 'profile.html'
    # login_url = '/login/' # Mixin එකටත් වෙනම login URL එකක් දෙන්න පුළුවන්, නැත්නම් settings.LOGIN_URL එක ගන්නවා

මේ දෙකෙන් ඔයාට User එක authenticated නැත්නම් protected content වලට access කරන එක වළක්වන්න පුළුවන්.

අනික template එකක් ඇතුළේ User කෙනෙක් login වෙලාද කියලා බලන්න request.user.is_authenticated එක පාවිච්චි කරන්න පුළුවන්.

<!-- base.html හෝ වෙනත් template එකක -->
<nav>
    {% if user.is_authenticated %}
        <a href="{% url 'profile' %}">Hello, {{ user.username }}</a>
        <a href="{% url 'logout' %}">Logout</a>
    {% else %}
        <a href="{% url 'login' %}">Login</a>
        <a href="{% url 'signup' %}">Sign Up</a>
    {% endif %}
</nav>

හොඳම භාවිතයන් සහ ගැටළු විසඳීම (Best Practices & Troubleshooting)

Password Hashing (මුරපද ආරක්ෂාව)

passwords කියන්නේ ඕනෑම system එකක තියෙන වැදගත්ම sensitive data එකක්. ඒවා කිසිම වෙලාවක plain text වලින් database එකේ store කරන්න හොඳ නැහැ. Django වල authentication system එක මේක ඔටෝ කරලා දෙනවා, ඒක secure hashing algorithms (වර්තමානයේ PBKDF2) පාවිච්චි කරලා passwords hash කරනවා. ඒ නිසා ඔයාට ඒ ගැන වැඩිපුර හිතන්න ඕනේ නැහැ, Django එක ඒක බලාගන්නවා. හැබැයි, ඔයා custom password validation එකක් කරනවා නම්, passwords hash කරන විදිය ගැන දැනගෙන ඉන්න එක හොඳයි.

Custom User Model (ඔබේම පරිශීලක Model එකක්)

Django වල built-in User model එක ඔයාගේ අවශ්‍යතා වලට මදි වෙන්න පුළුවන්. උදාහරණයක් විදියට, User කෙනෙක්ට phone number එකක්, profile picture එකක්, නැත්නම් වෙනත් custom fields එකතු කරන්න ඕනේ නම් custom User model එකක් හදන්න වෙනවා.

මේක කරන්න පුළුවන් ප්‍රධාන විදියවල් දෙකක් තියෙනවා:

  1. AbstractUser extend කිරීම: මේක තමයි වඩාත් හොඳම ක්‍රමය. Django වල User model එකේ තියෙන හැමදේම තියාගෙන ඔයාට අවශ්‍ය අලුත් fields එකතු කරන්න පුළුවන්.
  2. AbstractBaseUser extend කිරීම: මේකෙන් ඔයාට User model එක මුල ඉඳන්ම customize කරන්න පුළුවන්, හැබැයි ඒක ටිකක් සංකීර්ණයි. Django වල Admin site එකත් එක්ක integrate කරන්න ඔයාට BaseUserManager එකක් හදන්න වෙනවා.

ඔයා custom User model එකක් පාවිච්චි කරනවා නම්, ඒක project එකේ මුලදීම තීරණය කරන්න ඕනේ. මොකද, migrations run කරලා data දාපුවාට පස්සේ User model එක වෙනස් කරන එක ටිකක් අමාරු වැඩක්.

# myapp/models.py (AbstractUser extend කරන හැටි)
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=15, blank=True, null=True)
    # Add any other fields you need

    def __str__(self):
        return self.username

ඊට පස්සේ settings.py එකේ AUTH_USER_MODEL එක මේ විදියට set කරන්න.

# myproject/settings.py
AUTH_USER_MODEL = 'myapp.CustomUser'

මේක කරාට පස්සේ python manage.py makemigrations සහ python manage.py migrate commands ටික run කරන්න අමතක කරන්න එපා.

ගැටළු විසඳීම (Troubleshooting)

  • Permission Denied Errors: User කෙනෙක්ට access කරන්න බැරි page එකකට යන්න හදනකොට මේ error එක එන්න පුළුවන්. @login_required decorator එක දාලා තියෙන view එකකට login වෙලා නැති User කෙනෙක් යන්න හදනවා නම්, Django එයාව LOGIN_URL එකට redirect කරනවා. settings.py එකේ LOGIN_URL එක හරියට දීලා තියෙනවද කියලා බලන්න.
  • CSRF Verification Failed: form එකක් submit කරනකොට මේ error එක එනවා නම්, ඔයාගේ template එකේ {% csrf_token %} එක දාලා නැත්නම්, නැත්නම් token එක වැරදි නම් මේක වෙන්න පුළුවන්. form එක ඇතුළේ ඒක අනිවාර්යයෙන්ම තියෙන්න ඕනේ.
  • User login වුණාට පස්සේ authenticated නැහැ: django.contrib.sessions එක INSTALLED_APPS වල තියෙනවද, MIDDLEWARE එකේ django.contrib.sessions.middleware.SessionMiddleware සහ django.contrib.auth.middleware.AuthenticationMiddleware තියෙනවද කියලා බලන්න.

ආරක්ෂාව (Security)

web application එකක authentication කියන්නේ security වලට අත්‍යවශ්‍යම කොටසක්. හැමවිටම මතක තියාගන්න:

  • HTTPS පාවිච්චි කරන්න: User ගේ credentials encrypted කරලා යවන්න production environment වල HTTPS අනිවාර්යයෙන්ම පාවිච්චි කරන්න.
  • ශක්තිමත් Passwords: User ලට ශක්තිමත් passwords පාවිච්චි කරන්න encourage කරන්න. Django වල password validators පාවිච්චි කරන්න පුළුවන්.
  • Rate Limiting: login attempts වලට rate limiting එකක් දාන්න, ඒකෙන් brute-force attacks වලින් ආරක්ෂා වෙන්න පුළුවන්.

නිගමනය (Conclusion)

හොඳයි යාළුවනේ, අපි මේ tutorial එකෙන් Django වල authentication system එක ගැන ගොඩක් දේවල් කතා කළා. User registration එකේ ඉඳලා, login, logout සහ views වලට access restrict කරන එක දක්වාම අපි පියවරෙන් පියවර බැලුවා. Django වල built-in authentication system එක කොච්චර බලවත්ද, පහසුද කියලා ඔයාලට දැන් තේරෙන්න ඇති.

මේවා පාවිච්චි කරලා ඔයාට User කෙනෙක්ට signup වෙන්න, login වෙන්න, logout වෙන්න සහ securely access restricted content වලට access කරන්න පුළුවන් robust web application එකක් හදන්න පුළුවන්.

දැන් ඔයාට පුළුවන් ඔයාගේම Django project එකක මේ authentication system එක implement කරන්න. මොනවා හරි ප්‍රශ්න තියෙනවා නම්, පහළින් comment එකක් දාලා අහන්න! අපි එකට මේවා ඉගෙන ගනිමු!

අපේම භාෂාවෙන් මේ වගේ tutorial තව ඕනේ නම් කියන්න. ඊළඟ tutorial එකෙන් හම්බවෙමු!