DRF Permissions tizimi, IsOwnerOrStaff va obyekt darajasidagi xavfsizlik
10-sinfAdvanced Python Back-end2-hafta · 5-darsAllowAny, IsAuthenticated, IsAdminUser va IsAuthenticatedOrReadOnly.
BasePermission, has_permission va has_object_permission mexanizmi.
Obyekt egaligini xavfsiz biriktirish va kiberhujumlarni bartaraf etish.
So'rovlarni tekshirish bosqichlari
Har bir HTTP so'rovining viewga yetib borish yo'li
Barcha foydalanuvchilar (mehmonlar ham) uchun to'liq ochiq.
Faqat tizimga kirgan va yaroqli tokenga ega foydalanuvchilar.
Faqat is_staff=True bo'lgan admin va xodimlar uchun.
O'qish hammaga ochiq, yozish faqat kirganlar uchun.
O'z biznes qoidalarimizni yaratish
Foydalanuvchi birovning maqolasini o'zgartirmoqchi bo'lganda nima sodir bo'ladi?
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
Muallifni server tomonida xavfsiz biriktirish
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)
Bosing va tekshiring
Foydalanuvchi kimligi ma'lum, ammo bu amalni bajarishga huquqi yetarli emas.
Bosing va tekshiring
Bazani o'zgartirmaydigan GET, HEAD, OPTIONS so'rovlari to'plami.
Bosing va tekshiring
Bazaga yozishdan oldin joriy foydalanuvchini muallif qilib ulaydi.
Nima uchun maqola muallifini frontenddan JSON orqali qabul qilish xavfli hisoblanadi?
IsAuthenticated qo'yish va obyekt egasini tekshirmaslik (barcha foydalanuvchilar bir-birining postini o'chira oladi!).
has_object_permission (masalan IsOwnerOrStaff) orqali obyekt egaligini tekshiring.
apps/common/permissions.py da IsStaffOrReadOnly klassini yozing.
IsOwnerOrStaff klassini yozing va PostViewSet ga ulang.
perform_create ni yozing va boshqa user nomidan post tahrirlashda 403 Forbidden oling.
Keyingi darsda: Filtrlash, qidiruv (Search) va tartiblash (Ordering) vositalarini quramiz!