۰
در هر اپلیکیشن وب، مدیریت دسترسی و مجوزهای کاربران از اهمیت بالایی برخوردار است تا اطمینان حاصل شود که کاربران فقط میتوانند اقدامات مجاز را انجام دهند. جنگو (Django) به عنوان یک فریمورک جامع وب، سیستم قدرتمند و انعطافپذیری برای مدیریت مجوزها و گروههای کاربری ارائه میدهد. در این مقاله، نحوه راهاندازی و مدیریت مجوزها و گروهها در جنگو را بررسی میکنیم تا بتوانید سیستمهای پیچیده کنترل دسترسی مبتنی بر نقش (Role-Based Access Control یا RBAC) را بهسادگی پیادهسازی کنید.
مجوزها و گروههای کاربری به شما این امکان را میدهند که:
جنگو یک سیستم مجوز داخلی در سطح مدل دارد. برای هر مدل، سه مجوز پیشفرض تعریف میشود:
این مجوزها به طور خودکار هنگام اجرای دستورات makemigrations و migrate ساخته میشوند.
برای کنترل دقیقتر، میتوانید مجوزهای سفارشی تعریف کنید. برای این کار کافیست در کلاس Meta مدل خود، یک ویژگی permissions اضافه کنید:
1from django.db import models 2 3 4class Document(models.Model): 5 title = models.CharField(max_length=100) 6 content = models.TextField() 7 8 class Meta: 9 permissions = [ 10 ('can_publish', 'Can publish documents'), 11 ('can_archive', 'Can archive documents'), 12 ]
در مثال بالا، دو مجوز سفارشی can_publish و can_archive تعریف شدهاند.
میتوانید مجوزها را به صورت برنامهنویسی یا از طریق رابط مدیریت (Admin Interface) به کاربران اختصاص دهید.
در کد خود، میتوانید با استفاده از ویژگی user_permissions مدل User مجوزها را اضافه کنید:
1from django.contrib.auth.models import User, Permission 2 3# گرفتن یک کاربر 4user = User.objects.get(username='john') 5 6# گرفتن یک مجوز خاص 7permission = Permission.objects.get(codename='can_publish') 8 9# اختصاص مجوز به کاربر 10user.user_permissions.add(permission) 11 12# بررسی داشتن مجوز مشخص 13user.has_perm('app_name.can_publish')
در اینجا app_name را با نام اپلیکیشن خود جایگزین کنید.
گروهها در جنگو ابزاری برای جمعآوری مجموعهای از مجوزها و اختصاص دستهای آنها به کاربران هستند. این موضوع برای پیادهسازی نقشهایی مانند Admin، Editor و Viewer بسیار کاربردی است.
گروه را میتوانید از طریق رابط مدیریت یا به صورت برنامهنویسی ایجاد کنید:
1from django.contrib.auth.models import Group, Permission 2 3# ایجاد گروه جدید 4editors_group = Group.objects.create(name='Editors') 5 6# اختصاص مجوز به گروه 7publish_permission = Permission.objects.get(codename='can_publish') 8editors_group.permissions.add(publish_permission)
بعد از تعریف گروه و اختصاص مجوزها، کاربران را به گروه اضافه کنید:
1# گرفتن یک کاربر 2user = User.objects.get(username='john') 3 4# افزودن کاربر به گروه Editors 5editors_group.user_set.add(user)
با این کار، تمام مجوزهای گروه Editors به کاربر john اعمال میشود.
جنگو متدهای مختلفی برای بررسی مجوزهای کاربران فراهم کرده است:
user.has_perm(permission_codename) : بررسی داشتن یک مجوز خاص، مثلاً1user.has_perm('app_name.can_publish')
user.has_perms([perm_list]) : بررسی داشتن همه مجوزهای موجود در لیست1user.has_perms(['app_name.can_publish', 'app_name.can_archive'])
user.is_superuser : مقدار True اگر کاربر سوپر یوزر بوده و همه مجوزها را دارد.user.is_staff : مقدار True اگر کاربر دسترسی به رابط مدیریت را دارد.میتوانید با استفاده از دکوراتورها و میکسینهای پیشساخته جنگو دسترسی به ویوها را بر اساس مجوزهای کاربر محدود کنید.
@permission_requiredاین دکوراتور تضمین میکند که کاربر قبل از مشاهده یک ویو، یک مجوز خاص را داشته باشد:
1from django.contrib.auth.decorators import permission_required 2from django.http import HttpResponse 3 4@permission_required('app_name.can_publish', raise_exception=True) 5def publish_document(request): 6 return HttpResponse("Document Published")
@permission_required(permission_codename) مجوز مشخص شده را بررسی میکند.raise_exception=True در صورت عدم وجود مجوز، خطای PermissionDenied ایجاد میکند.PermissionRequiredMixinاگر از کلاسبیسد ویوها (CBV) استفاده میکنید، میتوانید از میکسین زیر بهره ببرید:
1from django.contrib.auth.mixins import PermissionRequiredMixin 2from django.views.generic import View 3from django.http import HttpResponse 4 5class PublishDocumentView(PermissionRequiredMixin, View): 6 permission_required = 'app_name.can_publish' 7 raise_exception = True 8 9 def get(self, request, *args, **kwargs): 10 return HttpResponse("Document Published")
PermissionRequiredMixin قبل از دسترسی، مجوز را بررسی و بر اساس آن دسترسی را محدود میکند.
اگر اپلیکیشن شما نیاز به مدیریت مجوزهای پیچیدهتر دارد، میتوانید مدل کاربر را با ارثبری از AbstractUser یا AbstractBaseUser سفارشی کنید تا فیلدها و متدهای خاص برای اداره مجوزها و نقشها را اضافه کنید.
1from django.contrib.auth.models import AbstractUser 2from django.db import models 3 4class CustomUser(AbstractUser): 5 department = models.CharField(max_length=100) 6 7 def get_department_permissions(self): 8 pass
با سفارشی کردن مدل کاربر میتوانید سطح بالاتری از پیچیدگی در کنترل مجوزها و شخصیسازی سیستم داشته باشید.
اگر نیاز به مجوزهای سطح شیء (Object-level permissions) دارید — مثلاً کاربر فقط بتواند اسناد متعلق به خودش را ویرایش کند — از پکیج django-guardian استفاده کنید. این پکیج سیستم مجوزهای جنگو را گسترش میدهد و امکان تعیین مجوز برای هر شیء را فراهم میکند.
django-guardian:1pip install django-guardian
1INSTALLED_APPS = [ 2 ... 3 'guardian', 4] 5 6AUTHENTICATION_BACKENDS = ( 7 'django.contrib.auth.backends.ModelBackend', 8 'guardian.backends.ObjectPermissionBackend', 9)
1from guardian.shortcuts import assign_perm, remove_perm 2 3# اختصاص مجوز به یک کاربر برای یک شیء مشخص 4assign_perm('change_document', user, document) 5 6# بررسی داشتن مجوز برای آن شیء 7user.has_perm('change_document', document)
مدیریت مجوزها و گروهها در جنگو راه قدرتمندی برای پیادهسازی کنترل دسترسی مبتنی بر نقش در اپلیکیشن شماست. با بهرهگیری از سیستم مجوز داخلی جنگو، گروهها و مجوزهای سفارشی، میتوانید ساختار انعطافپذیر و امنی ایجاد کنید که به نیازهای خاص پروژه پاسخ دهد. برای سناریوهای پیشرفتهتر، مدلهای کاربر سفارشی یا ابزارهای جانبی مانند django-guardian برای مجوزهای سطح شیء را در نظر بگیرید. با تنظیم درست این موارد، خواهید توانست اپلیکیشنی امن، پایدار و قابل توسعه داشته باشید.
۰
کد با می متعهد است که بالاترین سطح کیفی آموزش را در اختیار شما بگذارد. هدف به اشتراک گذاشتن دانش فناوری اطلاعات و توسعه نرم افزار در بالاترین سطح ممکن برای درستیابی به جامعه ای توانمند و قدرتمند است. ما باور داریم هر کسی میتواند با استمرار در یادگیری برنامه نویسی چالش های خود و جهان پیرامون خود را بر طرف کند و به موفقیت های چشم گیر برسد. با ما در این مسیر همراه باشید. کد با می اجتماع حرفه ای برنامه نویسان ایرانی.