AXV

Ruxsatlar Bilan Ishlash

DRF Permissions tizimi, IsOwnerOrStaff va obyekt darajasidagi xavfsizlik

10-sinfAdvanced Python Back-end2-hafta · 5-dars

Dars rejasi

Standart Permissions

AllowAny, IsAuthenticated, IsAdminUser va IsAuthenticatedOrReadOnly.

Custom Permissions

BasePermission, has_permission va has_object_permission mexanizmi.

perform_create & IDOR

Obyekt egaligini xavfsiz biriktirish va kiberhujumlarni bartaraf etish.

01

DRF Ruxsatlar tizimi

So'rovlarni tekshirish bosqichlari

So'rovni tekshirish zanjiri

Har bir HTTP so'rovining viewga yetib borish yo'li

1. HTTP So'rov PUT /posts/12/ Token bilan birga 2. Autentifikatsiya request.user Foydalanuvchi aniqlandi 3. Permission has_object_permission Muallif tekshiruvi 200 OK Yoki 403

Standart DRF ruxsatlari

AllowAny

Barcha foydalanuvchilar (mehmonlar ham) uchun to'liq ochiq.

IsAuthenticated

Faqat tizimga kirgan va yaroqli tokenga ega foydalanuvchilar.

IsAdminUser

Faqat is_staff=True bo'lgan admin va xodimlar uchun.

IsAuthOrReadOnly

O'qish hammaga ochiq, yozish faqat kirganlar uchun.

02

Custom Permissions

O'z biznes qoidalarimizni yaratish

IDOR zaifligi va undan himoyalanish

Foydalanuvchi birovning maqolasini o'zgartirmoqchi bo'lganda nima sodir bo'ladi?

Foydalanuvchi: Anvar O'zining ID si: 10 So'rov: DELETE /posts/5/ (5-post Begzodniki!) IsOwnerOrStaff post.author == Anvar? False! (Begzod != Anvar) Anvar adminmi? False! (oddiy user) 403 Forbidden Ruxsat berilmadi! Baza daxlsiz qoldi

src/apps/common/permissions.py

class IsOwnerOrStaff(BasePermission):
    owner_field = "author"

    def has_object_permission(self, request, view, obj):
        if request.method in SAFE_METHODS:
            return True  # O'qishga hammaga ruxsat

        user = request.user
        if not (user and user.is_authenticated):
            return False
        if user.is_staff:
            return True  # Adminga to'liq ruxsat

        owner = getattr(obj, self.owner_field, None)
        return owner == user
03

perform_create amali

Muallifni server tomonida xavfsiz biriktirish

perform_create nima uchun kerak?

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    lookup_field = "slug"
    permission_classes = (IsAuthenticatedOrReadOnly, IsOwnerOrStaff)

    def perform_create(self, serializer):
        # Muallifni frontenddan EMAS, tokendan olamiz!
        serializer.save(author=self.request.user)
Bu usul orqali hech kim boshqa odamning ID raqamini ko'rsatib, uning nomidan yolg'on maqola chop eta olmaydi.

Atamalarni eslab qolamiz

403 Forbidden

Bosing va tekshiring

Taqiqlangan

Foydalanuvchi kimligi ma'lum, ammo bu amalni bajarishga huquqi yetarli emas.

SAFE_METHODS

Bosing va tekshiring

Xavfsiz metodlar

Bazani o'zgartirmaydigan GET, HEAD, OPTIONS so'rovlari to'plami.

perform_create

Bosing va tekshiring

Saqlashdan avval

Bazaga yozishdan oldin joriy foydalanuvchini muallif qilib ulaydi.

Tezkor bilim tekshiruvi

Nima uchun maqola muallifini frontenddan JSON orqali qabul qilish xavfli hisoblanadi?

To'g'ri! Muallif har doim server tomonidan olingan request.user orqali belgilanadi. Bu soxtaliklarning oldini oladi.

Dasturchilar ko'p yo'l qo'yadigan xatolar

Xato: Faqat IsAuthenticated qo'yish va obyekt egasini tekshirmaslik (barcha foydalanuvchilar bir-birining postini o'chira oladi!).
To'g'ri: Har doim has_object_permission (masalan IsOwnerOrStaff) orqali obyekt egaligini tekshiring.

Amaliy topshiriq 15 daqiqa

Oson apps/common/permissions.py da IsStaffOrReadOnly klassini yozing.
O'rta IsOwnerOrStaff klassini yozing va PostViewSet ga ulang.
Qiyin perform_create ni yozing va boshqa user nomidan post tahrirlashda 403 Forbidden oling.
AXV

Darsni yakunlaymiz

Keyingi darsda: Filtrlash, qidiruv (Search) va tartiblash (Ordering) vositalarini quramiz!

BasePermission IsStaffOrReadOnly IsOwnerOrStaff perform_create