Permissions and Authorization
অথেন্টিকেশন (কে আপনি?) এবং অথোরাইজেশন (আপনি কি করতে পারবেন?) দুটি আলাদা জিনিস। Django-তে খুব শক্তিশালী পারমিশন সিস্টেম আছে যা দিয়ে আপনি কন্ট্রোল করতে পারেন কোন ইউজার কোন পেজ বা ডাটা দেখতে পাবে।
১. ডিফল্ট পারমিশন সিস্টেম
যখন আপনি কোনো মডেল তৈরি করেন এবং মাইগ্রেট করেন, Django অটোমেটিক ৪টি পারমিশন তৈরি করে প্রতি মডেলের জন্য:
add: ডাটা যোগ করাchange: ডাটা এডিট করাdelete: ডাটা মুছে ফেলাview: ডাটা দেখা
পারমিশনগুলো app_label.action_modelname ফরম্যাটে থাকে। উদাহরণ: store.add_product, store.change_product।
২. ইউজার এবং গ্রুপ পারমিশন
এডমিন প্যানেল থেকে খুব সহজেই ইউজার বা গ্রুপকে পারমিশন দেওয়া যায়।
১.১ ইউজারকে পারমিশন দেওয়া (কোড দিয়ে)
from django.contrib.auth.models import Permission, User
user = User.objects.get(username='ripon')
permission = Permission.objects.get(codename='add_product')
user.user_permissions.add(permission)১.২ পারমিশন চেক করা (has_perm)
if user.has_perm('store.add_product'):
print("User can add products!")
else:
print("Permission Denied!")৩. ভিউ লেভেলে পারমিশন চেক
কোনো ভিউতে এক্সেস কন্ট্রোল করার জন্য।
৩.১ @permission_required ডেকোরেটর (FBV)
from django.contrib.auth.decorators import permission_required
@permission_required('store.add_product', login_url='/login/')
def add_product_view(request):
# কোড...৩.২ PermissionRequiredMixin (CBV)
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.views.generic import CreateView
class ProductCreateView(PermissionRequiredMixin, CreateView):
permission_required = 'store.add_product'
template_name = 'product_form.html'
model = Product৪. টেমপ্লেটে পারমিশন চেক
টেমপ্লেটে আমরা চেক করতে পারি ইউজারের পারমিশন আছে কি না, এবং সেই অনুযায়ী বাটন দেখাতে বা লুকাতে পারি।
{% if perms.store.add_product %}
<a href="/add-product/">Add New Product</a>
{% endif %}এখানে perms.app_label.permission_codename প্যাটার্ন ব্যবহার হয়।
৫. Custom Permissions
ডিফল্ট (add, change, delete, view) এর বাইরে যদি নিজের মতো পারমিশন দরকার হয়।
models.py:
class BlogPost(models.Model):
title = models.CharField(max_length=100)
class Meta:
permissions = [
("can_publish_post", "Can publish blog posts"),
("can_feature_post", "Can make a post featured"),
]মাইগ্রেশন চালানোর পর এই পারমিশনগুলো ডাটাবেসে তৈরি হবে এবং আপনি এগুলো ব্যবহার করতে পারবেন (blog.can_publish_post)।
৬. Object-Level Permissions (Advanced)
Django-র ডিফল্ট পারমিশন সিস্টেম টেবিল লেভেলে কাজ করে। অর্থাৎ, কাউকে change_product পারমিশন দিলে সে সব প্রোডাক্ট এডিট করতে পারবে।
কিন্তু যদি আপনি চান একজন ইউজার শুধু নিজের তৈরি করা প্রোডাক্ট এডিট করতে পারবে? একে বলে Object-Level Permission।
Django ডিফল্টভাবে এটি সাপোর্ট করে না। এর জন্য থার্ড-পার্টি লাইব্রেরি django-guardian ব্যবহার করা হয় অথবা কাস্টম লজিক লিখতে হয়।
৬.১ UserPassesTestMixin দিয়ে সমাধান
সহজ অবজেক্ট লেভেল চেকিংয়ের জন্য এটি সেরা।
from django.contrib.auth.mixins import UserPassesTestMixin
from django.views.generic import UpdateView
class PostUpdateView(UserPassesTestMixin, UpdateView):
model = Post
def test_func(self):
post = self.get_object() # যেই পোস্ট এডিট করতে চাচ্ছে
return self.request.user == post.author # রিকোয়েস্ট ইউজার কি লেখক?যদি test_func False রিটার্ন করে, তবে ইউজার '403 Forbidden' এরর পাবে।