Django

⌘K
  1. Home
  2. Django
  3. Django তে কিভাবে কাজ করতে...
  4. Permission
  5. ১. Field level permission (ফিল্ড-লেভেল পারমিশন)

১. Field level permission (ফিল্ড-লেভেল পারমিশন)

Django স্বয়ংক্রিয়ভাবে প্রতিটি মডেলের জন্য কিছু ডিফল্ট পারমিশন প্রদান করে, যা হলো:

  1. add – নতুন ডাটা যোগ করার অনুমতি।
  2. change – ডাটা পরিবর্তনের অনুমতি।
  3. delete – ডাটা মুছে ফেলার অনুমতি।
  4. view – ডাটা দেখার অনুমতি।

নিচে Django-তে Unfold Admin Panel এবং Django Guardian ব্যবহার করে ফিল্ড-ভিত্তিক পারমিশন সেটআপের সম্পূর্ণ বাংলা টিউটোরিয়াল দেওয়া হলো:


ধাপ ১: প্রজেক্ট সেটআপ ও প্যাকেজ ইন্সটল

১. ডিজাঙ্গো ও প্যাকেজ ইন্সটল করুন:

   pip install django django-unfold django-guardian

২. প্রজেক্ট ও অ্যাপ তৈরি করুন:

   django-admin startproject myproject
   cd myproject
   python manage.py startapp myapp

ধাপ ২: সেটিংস কনফিগারেশন

settings.py ফাইলে নিচের পরিবর্তনগুলো করুন:

# settings.py
INSTALLED_APPS = [
    'unfold',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'guardian',
    'myapp',  # আপনার অ্যাপের নাম
]

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'guardian.backends.ObjectPermissionBackend',
)

ধাপ ৩: মডেল তৈরি করুন

myapp/models.py এ একটি মডেল যোগ করুন:

from django.db import models
from django.contrib.auth.models import User

class Document(models.Model):
    title = models.CharField(max_length=200, verbose_name="ডকুমেন্টের নাম")
    content = models.TextField(verbose_name="কন্টেন্ট")
    confidential = models.TextField(verbose_name="গোপন নোট")  # রেস্ট্রিক্টেড ফিল্ড
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        permissions = [
            ("view_confidential", "গোপন নোট দেখার অনুমতি"),
            ("change_confidential", "গোপন নোট এডিটের অনুমতি"),
        ]

ধাপ ৪: অ্যাডমিন প্যানেল কাস্টমাইজ (Unfold + Guardian)

myapp/admin.py ফাইলটি এভাবে তৈরি করুন:

from unfold.admin import ModelAdmin
from django.contrib import admin
from guardian.admin import GuardedModelAdmin
from .models import Document

@admin.register(Document)
class DocumentAdmin(GuardedModelAdmin, ModelAdmin):
    list_display = ['title', 'owner']

    # ফিল্ড দেখার অনুমতি চেক
    def get_fields(self, request, obj=None):
        fields = super().get_fields(request, obj)
        if not request.user.has_perm('myapp.view_confidential', obj):
            fields = [f for f in fields if f != 'confidential']
        return fields

    # ফিল্ড এডিটের অনুমতি চেক
    def get_readonly_fields(self, request, obj=None):
        readonly = super().get_readonly_fields(request, obj)
        if not request.user.has_perm('myapp.change_confidential', obj):
            readonly += ('confidential',)
        return readonly

    # শুধু ইউজারের নিজের ডকুমেন্ট দেখাবে
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(owner=request.user)

ধাপ ৫: মাইগ্রেশন ও সুপারইউজার তৈরি

python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser

ধাপ ৬: পারমিশন অ্যাসাইন (প্র্যাকটিক্যাল উদাহরণ)

১. ডিজাঙ্গো শেলে পারমিশন অ্যাসাইন:

   python manage.py shell
   from django.contrib.auth.models import User
   from myapp.models import Document
   from guardian.shortcuts import assign_perm

   user = User.objects.get(username='user1')
   doc = Document.objects.get(id=1)

   # পারমিশন দিন
   assign_perm('myapp.view_confidential', user, doc)
   assign_perm('myapp.change_confidential', user, doc)

২. অ্যাডমিন প্যানেলে পারমিশন ম্যানেজ করুন:

  • Unfold অ্যাডমিনে গিয়ে Document মডেলে যান
  • “Object permissions” ট্যাবে ক্লিক করে পারমিশন অ্যাসাইন করুন

ধাপ ৭: টেস্টিং

১. ভিউ পারমিশন টেস্ট:

  • যে ইউজারের view_confidential পারমিশন নেই, সে confidential ফিল্ড দেখতে পাবে না

২. এডিট পারমিশন টেস্ট:

  • যে ইউজারের change_confidential পারমিশন নেই, সে ফিল্ডটি রিড-অনলি দেখবে

ট্রাবলশুটিং ও সুরক্ষা টিপস

১. বেকেন্ড ভ্যালিডেশন:

   # views.py
   if not request.user.has_perm('myapp.change_confidential', obj):
       raise PermissionDenied("এই ফিল্ড এডিটের অনুমতি নেই!")

২. টেমপ্লেটে চেক:

   {% if user.has_perm 'myapp.view_confidential' %}
       {{ object.confidential }}
   {% endif %}

চূড়ান্ত সেটআপ স্ক্রিনশট

Unfold Admin with Field Permissions (স্ক্রিনশট লিংক)


উপকারিতা

  • অবজেক্ট-লেভেল কন্ট্রোল: প্রতিটি ডকুমেন্টের জন্য আলাদা পারমিশন
  • মডার্ন UI: Unfold-এর সুন্দর ইন্টারফেস
  • সিকিউরিটি: Django Guardian-এর শক্তিশালী পারমিশন সিস্টেম

এই টিউটোরিয়াল অনুসরণ করে আপনি Django-তে Unfold ও Guardian দিয়ে প্রফেশনাল লেভেলের ফিল্ড-ভিত্তিক পারমিশন সিস্টেম বাস্তবায়ন করতে পারবেন। কোনো সমস্যা হলে কমেন্টে জানান! 😊

How can we help?