Django

⌘K
  1. Home
  2. Django
  3. Django তে কিভাবে কাজ করতে...
  4. Permission
  5. ৩. Django Guardian অবজেক্ট লেভেল পারমিশন

৩. Django Guardian অবজেক্ট লেভেল পারমিশন

এখানে দেখানো হচ্ছে যে যখন একজন ব্যবহারকারী কোন নতুন ডেটা ইন্সার্ট করে তখন ওই ডেটার id অনুযায়ী change,delete ও view বা দেখার পারমিশন সেট করা হচ্ছে শুধু এই একটি রেকর্ড বা অবজেক্ট এর জন্য এবং যখন এই মডেল এই রেকর্ড আপডেট করা হবে তখন চেক করা হবে user এর এই ডকুমেন্ট বা রেকর্ড বা অবজেক্ট টি আপডেট করার অবজেক্ট লেভেল পারমিশন আছে কিনা যদি না থাকে তাহলে আপডেট হবে না ডিলিট এর ক্ষেত্রেও একই নিয়ম প্রযোজ্য।

কাজের প্রফেশনাল বর্ণনা:

  1. নতুন ডকুমেন্ট ইনসার্টের পর Object-Level Permission অ্যাসাইনমেন্ট:
    • যখন একজন ব্যবহারকারী নতুন ডকুমেন্ট তৈরি করে, তখন তার উপর স্বয়ংক্রিয়ভাবে change, delete, এবং view পারমিশন দেওয়া হয়।
    • পারমিশন অ্যাসাইনমেন্টটি ব্যবহারকারী এবং নির্দিষ্ট ডকুমেন্টের মধ্যে সীমাবদ্ধ। এর ফলে ইউজার শুধুমাত্র সেই নির্দিষ্ট ডকুমেন্টটির উপর কার্যক্রম পরিচালনা করতে পারে, অন্য কোনো ডকুমেন্ট নয়। এটি নিশ্চিত করে যে সিস্টেমে অবাঞ্ছিত পরিবর্তন বা অ্যাক্সেস হচ্ছে না।
  2. আপডেট করার সময় Object-Level Permission চেক:
    • যখন একজন ব্যবহারকারী কোনও ডকুমেন্ট আপডেট করতে চায়, তখন সিস্টেম প্রথমে যাচাই করে যে তার কাছে সেই ডকুমেন্টটির change_document পারমিশন আছে কিনা।
    • যদি পারমিশন না থাকে, তাহলে 403 Permission Denied রেসপন্স দেওয়া হয়, যা অবাঞ্ছিত বা অনুমোদনবিহীন পরিবর্তন প্রতিরোধ করে।
    • পারমিশন থাকলে, ডকুমেন্টটি আপডেট করার অনুমতি দেওয়া হয়।
  3. ডিলিট করার সময় Object-Level Permission চেক:
    • ডকুমেন্ট মুছে ফেলার ক্ষেত্রে একই নীতি প্রযোজ্য। সিস্টেম প্রথমে যাচাই করে যে ব্যবহারকারীর কাছে delete_document পারমিশন আছে কিনা।
    • যদি না থাকে, তাহলে সিস্টেম একটি 403 Permission Denied রেসপন্স ফিরিয়ে দেয় এবং ডকুমেন্টটি মুছে ফেলা যাবে না।
    • এই সিস্টেম নিশ্চিত করে যে ডকুমেন্ট শুধুমাত্র অনুমোদিত ব্যবহারকারীই মুছতে পারবে।
  4. ডকুমেন্ট তালিকা দেখতে Object-Level Permission চেক:
    • ডকুমেন্ট লিস্টের জন্য সিস্টেম ব্যবহারকারীর প্রোফাইলের সাথে সম্পর্কিত কোম্পানির অধীনে থাকা ডকুমেন্টগুলো দেখায়। এভাবে ইউজার শুধুমাত্র তার অনুমোদিত ডকুমেন্টগুলো দেখতে সক্ষম হয়, যা ডেটা প্রাইভেসি ও সিকিউরিটি নিশ্চিত করে।

সারাংশ:

এই সিস্টেমটি সুনির্দিষ্ট Object-Level Permission ব্যবহার করে granular control প্রদান করে, যা প্রতিটি ডকুমেন্টের সাথে সংশ্লিষ্ট পারমিশন ভিত্তিক অ্যাক্সেস কন্ট্রোল নিশ্চিত করে। এটি একাধিক ব্যবহারকারী থাকা একটি সিস্টেমের জন্য ডেটার নিরাপত্তা এবং সঠিক ব্যবস্থাপনা নিশ্চিত করে, যেখানে একাধিক ব্যক্তি নির্দিষ্ট ডকুমেন্টে বিভিন্ন পর্যায়ে কাজ করে। সিস্টেমটি Object-Level Permission ম্যানেজমেন্টের মাধ্যমে unauthorized ডেটা অ্যাক্সেস ও পরিবর্তন প্রতিরোধ করে।

১. প্রজেক্ট স্ট্রাকচার

আমরা একটি Django প্রজেক্ট শুরু করব যেখানে আমরা Django REST Framework এবং Django Guardian ব্যবহার করব।

ধাপ ১: Django প্রজেক্ট তৈরি করা

django-admin startproject permission_system
cd permission_system
python manage.py startapp documents

ধাপ ২: প্রয়োজনীয় প্যাকেজ ইনস্টল করা

pip install djangorestframework django-guardian

ধাপ ৩: settings.py ফাইলে কনফিগারেশন যোগ করা

# Installed apps
INSTALLED_APPS = [
    # Django default apps...
    'rest_framework',
    'guardian',
    'documents',  # Our app
]

# Authentication backends for Django Guardian
AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',  # Default backend
    'guardian.backends.ObjectPermissionBackend',  # Guardian backend for object-level permissions
)

# Guardian settings
ANONYMOUS_USER_ID = -1

ধাপ ৪: মডেল তৈরি করা

আমরা একটি Document মডেল তৈরি করব, যেখানে কোম্পানি এবং ইউজার সম্পর্ক থাকবে।

# documents/models.py
from django.db import models
from django.contrib.auth.models import User

class Company(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

class Document(models.Model):
    name = models.CharField(max_length=255)
    content = models.TextField()
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

ধাপ ৫: মডেল রেজিস্ট্রেশন

# documents/admin.py
from django.contrib import admin
from .models import Document, Company

admin.site.register(Document)
admin.site.register(Company)

ধাপ ৬: মাইগ্রেশন চালানো

python manage.py makemigrations
python manage.py migrate

২. REST API তৈরি করা

ধাপ ৭: Serializer তৈরি করা

# documents/serializers.py
from rest_framework import serializers
from .models import Document

class DocumentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Document
        fields = '__all__'

ধাপ ৮: API ভিউ তৈরি করা

এখানে আমরা একজন ইউজারের উপর নির্দিষ্ট ডকুমেন্টের পারমিশন চেক করব এবং ইউজারের জন্য CRUD পারমিশন এসাইন করব।

# documents/views.py
from rest_framework import viewsets, status
from rest_framework.response import Response
from guardian.shortcuts import assign_perm, get_perms
from rest_framework.permissions import IsAuthenticated
from .models import Document
from .serializers import DocumentSerializer

class DocumentViewSet(viewsets.ModelViewSet):
    queryset = Document.objects.all()
    serializer_class = DocumentSerializer
    permission_classes = [IsAuthenticated]

    def perform_create(self, serializer):
        # নতুন ডকুমেন্ট তৈরি হলে ইউজারকে পারমিশন অ্যাসাইন করা হবে
        document = serializer.save(created_by=self.request.user)
        assign_perm('documents.view_document', self.request.user, document)
        assign_perm('documents.change_document', self.request.user, document)
        assign_perm('documents.delete_document', self.request.user, document)

    def list(self, request, *args, **kwargs):
        # ইউজারের পারমিশন চেক করা
        queryset = Document.objects.filter(company=request.user.profile.company)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
    
    def update(self, request, *args, **kwargs):
        document = self.get_object()
        if 'change_document' not in get_perms(request.user, document):
            return Response({'detail': 'Permission Denied'}, status=status.HTTP_403_FORBIDDEN)
        return super().update(request, *args, **kwargs)
        
    def destroy(self, request, *args, **kwargs):
        document = self.get_object()
        # Check if the user has the permission to delete the document
        if 'delete_document' not in get_perms(request.user, document):
            return Response({'detail': 'Permission Denied'}, status=status.HTTP_403_FORBIDDEN)
        return super().destroy(request, *args, **kwargs)        

ধাপ ৯: URL কনফিগার করা

# documents/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import DocumentViewSet

router = DefaultRouter()
router.register(r'documents', DocumentViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

How can we help?