Django ruxsat tizimining kuchini oching. Xavfsiz veb ilovalar uchun ruxsatlarni aniqlash, amalga oshirish va boshqarishni o'rganing.
Django ruxsat tizimini o'zlashtirish: Avtorizatsiya bo'yicha keng qamrovli qo'llanma
Veb-ishlab chiqish sohasida xavfsizlik ustuvor ahamiyatga ega. Django, kuchli Python veb-freymvorki, foydalanuvchi avtorizatsiyasini boshqarish va ilovangiz resurslarini himoya qilish uchun mustahkam va moslashuvchan ruxsat tizimini taqdim etadi. Ushbu keng qamrovli qo'llanma Django ruxsat tizimining nozik jihatlarini ochib beradi, Django loyihalaringizda xavfsiz va kengaytiriladigan avtorizatsiyani amalga oshirish bo'yicha amaliy misollar va ilg'or amaliyotlarni taklif etadi.
Autentifikatsiya va Avtorizatsiya o'rtasidagi farqni tushunish
Django ruxsat tizimining o'ziga xos xususiyatlariga sho'ng'ishdan oldin, autentifikatsiya va avtorizatsiya o'rtasidagi farqni tushunish juda muhimdir:
- Autentifikatsiya: Foydalanuvchi shaxsini tasdiqlaydi. "Siz kimsiz?" degan savolga javob beradi. Bu odatda foydalanuvchi nomi/parol birikmalari, ijtimoiy kirishlar yoki boshqa shaxsni tasdiqlovchi provayderlar orqali amalga oshiriladi.
- Avtorizatsiya: Autentifikatsiya qilingan foydalanuvchiga nima qilishga ruxsat berilganligini aniqlaydi. "Sizga nima qilishga ruxsat berilgan?" degan savolga javob beradi. Bu yerda Django ruxsat tizimi ishga tushadi.
Autentifikatsiya avtorizatsiyadan *oldin* keladi. Foydalanuvchiga nimalarga kirish yoki o'zgartirishga ruxsat berilganligini aniqlashdan oldin uning kimligini bilishingiz kerak.
Django'ning o'rnatilgan ruxsat tizimi
Django modellar, foydalanuvchilar va guruhlarga asoslangan o'rnatilgan ruxsat tizimini taqdim etadi. Uni asosiy avtorizatsiya ehtiyojlari uchun ishlatish oddiy, ammo yanada murakkab stsenariylarni hal qilish uchun kengaytirilishi va moslashtirilishi mumkin.
Model ruxsatlari
Django har bir model uchun sukut bo'yicha ruxsatlarni avtomatik ravishda yaratadi, bu sizga ushbu modelning instansiyalarini kim yaratishi, o'qishi, yangilashi va o'chirishi mumkinligini nazorat qilish imkonini beradi. Bu ruxsatlar:
- add_[modelname]: Modelning yangi instansiyalarini yaratishga ruxsat beradi.
- change_[modelname]: Modelning mavjud instansiyalarini yangilashga ruxsat beradi.
- delete_[modelname]: Modelning instansiyalarini o'chirishga ruxsat beradi.
- view_[modelname]: Model instansiyalarini ko'rishga ruxsat beradi (Django 3.1+).
Masalan, agar sizda `Article` nomli model bo'lsa, Django quyidagi ruxsatlarni yaratadi:
- `add_article`
- `change_article`
- `delete_article`
- `view_article`
Foydalanuvchilar va Guruhlar
Django'ning o'rnatilgan autentifikatsiya tizimi ruxsatlarni boshqarish uchun ikkita asosiy ob'ektni taqdim etadi:
- Foydalanuvchilar: Ilovangizdagi alohida foydalanuvchi hisoblari.
- Guruhlar: Umumiy ruxsatlarga ega foydalanuvchilar to'plami. Bu ko'plab foydalanuvchilarga ruxsatlarni bir vaqtning o'zida qo'llashning yanada qulayroq usulidir.
Siz ruxsatlarni to'g'ridan-to'g'ri foydalanuvchilarga tayinlashingiz mumkin, yoki ko'proq tarqalgan usul, guruhlarga ruxsatlarni tayinlash va keyin foydalanuvchilarni ushbu guruhlarga qo'shishdir.
Misol: Maqola ruxsatlarini boshqarish
Faraz qilaylik, sizda `Article` modeli bo'lgan blog ilovasi bor. Siz faqat ma'lum foydalanuvchilarga yangi maqolalar yaratish, mavjudlarini tahrirlash va maqolalarni o'chirishga ruxsat bermoqchisiz. Django'ning o'rnatilgan ruxsat tizimidan foydalangan holda buni qanday amalga oshirish mumkin:
- Guruhlar yaratish: Django admin panelida "Muharrir" va "Muallif" kabi guruhlarni yarating.
- Ruxsatlarni tayinlash: "Muharrir" guruhiga `add_article`, `change_article` va `delete_article` ruxsatlarini tayinlang. "Muallif" guruhiga faqat `add_article` ruxsatini tayinlang.
- Foydalanuvchilarni guruhlarga qo'shish: Tegishli foydalanuvchilarni "Muharrir" va "Muallif" guruhlariga qo'shing.
Endi "Muharrir" guruhidagi foydalanuvchilar maqolalarni boshqarishga to'liq ruxsatga ega bo'lishadi, "Muallif" guruhidagi foydalanuvchilar esa faqat yangi maqolalar yaratishlari mumkin bo'ladi.
Ruxsatlarni ko'rinishlarda (Views) amalga oshirish
Ruxsatlaringizni aniqlab va ularni foydalanuvchilar yoki guruhlarga tayinlaganingizdan so'ng, ushbu ruxsatlarni ko'rinishlaringizda qo'llashingiz kerak. Django buni amalga oshirishning bir necha usulini taqdim etadi:
`permission_required` Dekoratori
Ushbu `@permission_required` dekoratori ma'lum ruxsatlarga ega foydalanuvchilargina ko'rinishga kirishini cheklashning oddiy usulidir.
from django.contrib.auth.decorators import permission_required
from django.shortcuts import render
@permission_required('myapp.add_article')
def create_article(request):
# Faqat 'myapp.add_article' ruxsatiga ega foydalanuvchilar ushbu ko'rinishga kirishi mumkin
return render(request, 'myapp/create_article.html')
Agar talab qilingan ruxsatsiz foydalanuvchi ko'rinishga kirishga harakat qilsa, u sozlamalaringizga qarab kirish sahifasiga yo'naltiriladi yoki 403 Forbidden xatosini oladi.
`LoginRequiredMixin` va `PermissionRequiredMixin` (Sinfga asoslangan ko'rinishlar uchun)
Sinfga asoslangan ko'rinishlar uchun autentifikatsiya va avtorizatsiyani ta'minlash uchun `LoginRequiredMixin` va `PermissionRequiredMixin` dan foydalanishingiz mumkin:
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.views.generic import CreateView
from .models import Article
class ArticleCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
model = Article
fields = ['title', 'content']
permission_required = 'myapp.add_article'
template_name = 'myapp/article_form.html'
Ushbu misol `ArticleCreateView`ga faqat autentifikatsiya qilingan va `add_article` ruxsatiga ega foydalanuvchilarning kirishini cheklashni ko'rsatadi.
Ruxsatlarni qo'lda tekshirish
Shuningdek, foydalanuvchi ob'ektidagi `has_perm()` metodidan foydalanib, ko'rinishlaringizda ruxsatlarni qo'lda tekshirishingiz mumkin:
from django.shortcuts import render, redirect
def update_article(request, article_id):
article = Article.objects.get(pk=article_id)
if request.user.has_perm('myapp.change_article', article):
# Foydalanuvchi maqolani yangilashga ruxsatga ega
# Yangilash logikasini shu yerda amalga oshiring
return render(request, 'myapp/update_article.html', {'article': article})
else:
# Foydalanuvchida ruxsat yo'q
return render(request, 'myapp/permission_denied.html')
Ushbu misolda biz foydalanuvchining ma'lum bir `article` instansiyasi uchun `change_article` ruxsatiga ega ekanligini tekshiramiz. Bu sizga ob'ekt darajasidagi ruxsatlarni amalga oshirish imkonini beradi, bunda ruxsatlar kirilayotgan ma'lum ob'ektga asoslanib beriladi.
Maxsus ruxsatlar
Django'ning o'rnatilgan ruxsatlari ko'pincha asosiy avtorizatsiya ehtiyojlari uchun yetarli bo'ladi. Biroq, yanada murakkab ilovalarda, ma'lum biznes mantiqini yoki kirishni boshqarish talablarini aks ettirish uchun maxsus ruxsatlarni belgilashga ehtiyoj tug'ilishi mumkin.
Maxsus ruxsatlarni modellarida aniqlash
Siz maxsus ruxsatlarni modelingizning `Meta` sinfida `permissions` opsiyasidan foydalanib belgilashingiz mumkin:
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
published_date = models.DateTimeField(blank=True, null=True)
class Meta:
permissions = [
('can_publish_article', 'Maqolani nashr etishi mumkin'),
('can_comment_article', 'Maqolaga izoh yozishi mumkin'),
]
Ushbu misol ikkita maxsus ruxsatni belgilaydi: `can_publish_article` va `can_comment_article`. Bu ruxsatlar `python manage.py migrate` buyrug'ini ishga tushirganingizda avtomatik ravishda yaratiladi.
Maxsus ruxsatlardan foydalanish
Maxsus ruxsatlaringizni aniqlaganingizdan so'ng, ularni o'rnatilgan ruxsatlar bilan bir xil tarzda, ya'ni `@permission_required` dekoratori, `PermissionRequiredMixin` yoki `has_perm()` metodidan foydalanib ishlatishingiz mumkin.
from django.contrib.auth.decorators import permission_required
from django.shortcuts import render
@permission_required('myapp.can_publish_article')
def publish_article(request, article_id):
# Faqat 'myapp.can_publish_article' ruxsatiga ega foydalanuvchilar ushbu ko'rinishga kirishi mumkin
article = Article.objects.get(pk=article_id)
article.published_date = timezone.now()
article.save()
return render(request, 'myapp/article_published.html', {'article': article})
Ob'ekt darajasidagi ruxsatlar
Ob'ekt darajasidagi ruxsatlar modelning barcha instansiyalariga umumiy ruxsat berish o'rniga, modelning ma'lum instansiyalariga kirishni nazorat qilish imkonini beradi. Bu foydalanuvchilar faqat o'zlariga tegishli yoki ularga aniq ruxsat berilgan resurslarga kira oladigan yoki ularni o'zgartira oladigan ilovalar uchun juda muhimdir.
Ob'ekt darajasidagi ruxsatlarni amalga oshirish
Django'da ob'ekt darajasidagi ruxsatlarni amalga oshirishning bir necha usuli mavjud:
- Ruxsatlarni qo'lda tekshirish: Yuqorida ko'rsatilganidek, ma'lum bir ob'ekt instansiyasi uchun ruxsatlarni tekshirish uchun `has_perm()` metodidan foydalanishingiz mumkin.
- Uchinchi tomon kutubxonalaridan foydalanish: `django-guardian` kabi kutubxonalar ob'ekt darajasidagi ruxsatlarni boshqarishning yanada tuzilmali va qayta ishlatiladigan usullarini taqdim etadi.
Misol: `django-guardian` dan foydalanish
`django-guardian` ob'ekt darajasidagi ruxsatlarni tayinlash va tekshirish jarayonini soddalashtiradi. Mana bir oddiy misol:
- `django-guardian`ni o'rnatish: `pip install django-guardian`
- `settings.py`ni sozlash: `INSTALLED_APPS` ro'yxatiga `'guardian'`ni qo'shing va kerakli autentifikatsiya backendlarni sozlang.
- Ruxsatlarni tayinlash: Ma'lum ob'ektlar uchun foydalanuvchilar yoki guruhlarga ruxsat berish uchun `assign_perm()` funksiyasidan foydalaning.
- Ruxsatlarni tekshirish: Foydalanuvchining ma'lum bir ob'ekt uchun ma'lum bir ruxsatga ega ekanligini tekshirish uchun `has_perm()` funksiyasidan foydalaning.
from guardian.shortcuts import assign_perm, get_perms
# Ma'lum bir maqola uchun foydalanuvchiga 'change_article' ruxsatini tayinlash
assign_perm('change_article', user, article)
# Foydalanuvchining maqola uchun 'change_article' ruxsatiga ega ekanligini tekshirish
if user.has_perm('change_article', article):
# Foydalanuvchida ruxsat bor
pass
`django-guardian` shuningdek, sinfga asoslangan ko'rinishlar uchun `PermissionListMixin`ni taqdim etadi, bu foydalanuvchi kira oladigan ob'ektlar ro'yxatini ko'rsatishni osonlashtiradi.
Django REST Framework ruxsatlari
Agar siz Django REST Framework bilan REST APIlar qursangiz, API nuqtalariga kirishni nazorat qilish uchun uning ruxsat sinflaridan foydalanishingiz kerak bo'ladi. DRF bir nechta o'rnatilgan ruxsat sinflarini taqdim etadi, jumladan:
- `AllowAny`: API nuqtasiga cheklanmagan kirishga ruxsat beradi.
- `IsAuthenticated`: API nuqtasiga kirish uchun foydalanuvchining autentifikatsiya qilingan bo'lishini talab qiladi.
- `IsAdminUser`: API nuqtasiga kirish uchun foydalanuvchining administrator bo'lishini talab qiladi.
- `IsAuthenticatedOrReadOnly`: Autentifikatsiya qilinmagan foydalanuvchilarga faqat o'qish uchun kirishga ruxsat beradi, ammo yozish uchun autentifikatsiyani talab qiladi.
- `DjangoModelPermissions`: Kirishni nazorat qilish uchun Django'ning standart model ruxsatlaridan foydalanadi.
- `DjangoObjectPermissions`: Ob'ekt darajasidagi ruxsatlarni ta'minlash uchun `django-guardian`dan foydalanadi.
DRF ruxsat sinflaridan foydalanish
`permission_classes` atributidan foydalanib, ko'rinish uchun ruxsat sinflarini belgilashingiz mumkin:
from rest_framework import generics
from rest_framework.permissions import IsAuthenticated
class ArticleList(generics.ListCreateAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
permission_classes = [IsAuthenticated]
Ushbu misol `ArticleList` API nuqtasiga kirishni faqat autentifikatsiya qilingan foydalanuvchilarga cheklaydi.
Maxsus DRF ruxsatlari
Shuningdek, yanada murakkab avtorizatsiya mantig'ini amalga oshirish uchun maxsus DRF ruxsat sinflarini yaratishingiz mumkin. Maxsus ruxsat sinfi `rest_framework.permissions.BasePermission`dan meros qilib olishi va `has_permission()` va/yoki `has_object_permission()` metodlarini qayta belgilashi kerak.
from rest_framework import permissions
class IsAuthorOrReadOnly(permissions.BasePermission):
"""
Ob'ektning mualliflarigagina uni tahrirlashga ruxsat beruvchi maxsus ruxsat.
"""
def has_object_permission(self, request, view, obj):
# O'qish ruxsatlari har qanday so'rovga ruxsat beriladi,
# shuning uchun biz doimo GET, HEAD yoki OPTIONS so'rovlariga ruxsat beramiz.
if request.method in permissions.SAFE_METHODS:
return True
# Instansiyada `author` nomli atribut bo'lishi kerak.
return obj.author == request.user
Ushbu misol maqolani tahrirlashga faqat muallifiga ruxsat beradigan, o'qishga esa har kimga ruxsat beradigan maxsus ruxsat sinfini belgilaydi.
Xavfsizlik bo'yicha eng yaxshi amaliyotlar
Django ilovangizni himoya qilish uchun mustahkam ruxsat tizimini amalga oshirish juda muhimdir. Mana e'tibor berish kerak bo'lgan ba'zi xavfsizlik bo'yicha ilg'or amaliyotlar:
- Minimal imtiyoz prinsipi: Foydalanuvchilarga o'z vazifalarini bajarish uchun zarur bo'lgan minimal ruxsatlarni bering. Keraksiz ruxsatlarni tayinlashdan saqlaning.
- Guruhlardan foydalanish: Ruxsatlarni to'g'ridan-to'g'ri alohida foydalanuvchilarga tayinlash o'rniga, guruhlar orqali boshqaring. Bu boshqaruvni soddalashtiradi va xatolar xavfini kamaytiradi.
- Muntazam auditlar: Ruxsat sozlamalaringizni vaqti-vaqti bilan ko'rib chiqing, ular hali ham mos ekanligiga va ruxsatsiz kirishlar berilmaganligiga ishonch hosil qiling.
- Kirishni tozalash: Ruxsat tizimingizni chetlab o'tishi mumkin bo'lgan in'ektsiya hujumlarini oldini olish uchun har doim foydalanuvchi kiritishini tozalang.
- Sinfga to'liq tekshirish: Ruxsat tizimingizni to'liq tekshiring, uning kutilganidek ishlashini va hech qanday zaifliklar mavjud emasligini ta'minlang. Ruxsat tekshiruvlarini tasdiqlash uchun avtomatlashtirilgan testlar yozing.
- Yangilanib turish: Eng so'nggi xavfsizlik patchlari va xato tuzatishlaridan foydalanish uchun Django freymvorkingizni va tegishli kutubxonalarni yangilab turing.
- Kontent xavfsizligi siyosatini (CSP) ko'rib chiqing: CSP avtorizatsiya mexanizmlarini chetlab o'tish uchun ishlatilishi mumkin bo'lgan saytlararo skript (XSS) hujumlarini oldini olishga yordam beradi.
Xalqaroizatsiya bo'yicha fikrlar
Ruxsat tizimingizni global auditoriya uchun loyihalashtirayotganda, quyidagi xalqaroizatsiya jihatlarini hisobga oling:
- Rol nomlari: Agar ilovangiz rollardan foydalansa (masalan, Muharrir, Muallif, Moderator), ushbu rol nomlari barcha qo'llab-quvvatlanadigan tillar uchun oson tarjima qilinadigan va madaniy jihatdan mos kelishini ta'minlang. Rol nomlarining tilga xos variantlaridan foydalanishni ko'rib chiqing.
- Foydalanuvchi interfeysi: Foydalanuvchi interfeysini turli tillar va madaniy an'analarga moslashuvchan qilib loyihalashtiring. Bunga sana/vaqt formatlari, raqam formatlari va matn yo'nalishi kiradi.
- Vaqt zonasi: Vaqtga bog'liq hodisalarga asoslanib ruxsatlarni berish yoki bekor qilishda turli vaqt zonalarini hisobga oling. Vaqt tamg'alarini UTCda saqlang va ularni ko'rsatish uchun foydalanuvchining mahalliy vaqt zonasiga aylantiring.
- Ma'lumotlar maxfiyligi qoidalari: Turli mamlakatlardagi ma'lumotlar maxfiyligi qoidalaridan (masalan, Yevropada GDPR, Kaliforniyada CCPA) xabardor bo'ling. Tegishli rozilik mexanizmlarini va ma'lumotlarni himoya qilish choralarini amalga oshiring.
- Qulaylik: Ruxsat tizimingiz nogiron foydalanuvchilar uchun kirish mumkinligini ta'minlang, WCAG kabi qulaylik standartlariga rioya qiling.
Xulosa
Django ruxsat tizimi veb-ilovalarngizda avtorizatsiyani boshqarish uchun kuchli va moslashuvchan freymvorkni taqdim etadi. O'rnatilgan xususiyatlar, maxsus ruxsatlar, ob'ekt darajasidagi ruxsatlar va xavfsizlik bo'yicha ilg'or amaliyotlarni tushunib, siz qimmatli resurslaringizni himoya qiluvchi xavfsiz va kengaytiriladigan ilovalar yaratishingiz mumkin. Ruxsat tizimingizni ilovangizning o'ziga xos ehtiyojlariga moslashtirishni va ularning samaradorligini ta'minlash uchun sozlamalaringizni muntazam ravishda ko'rib chiqish va yangilab turishni unutmang.
Ushbu qo'llanma Django ruxsat tizimi bo'yicha keng qamrovli umumiy ma'lumot beradi. Yanada murakkab ilovalarni qurganingizda, yanada ilg'or stsenariylarga duch kelishingiz mumkin. Qo'shimcha yo'riqnomalar uchun Django hujjatlari va hamjamiyat resurslarini o'rganishdan tortinmang.