مدیریت دسترسی‌ها و گروه‌های کاربری در جنگو


۰


در هر اپلیکیشن وب، مدیریت دسترسی و مجوزهای کاربران از اهمیت بالایی برخوردار است تا اطمینان حاصل شود که کاربران فقط می‌توانند اقدامات مجاز را انجام دهند. جنگو (Django) به عنوان یک فریم‌ورک جامع وب، سیستم قدرتمند و انعطاف‌پذیری برای مدیریت مجوزها و گروه‌های کاربری ارائه می‌دهد. در این مقاله، نحوه راه‌اندازی و مدیریت مجوزها و گروه‌ها در جنگو را بررسی می‌کنیم تا بتوانید سیستم‌های پیچیده کنترل دسترسی مبتنی بر نقش (Role-Based Access Control یا RBAC) را به‌سادگی پیاده‌سازی کنید.

چرا مجوزها و گروه‌های کاربران را مدیریت کنیم؟

مجوزها و گروه‌های کاربری به شما این امکان را می‌دهند که:

  • کنترل دسترسی: محدود یا اجازه دهید کاربران به بخش‌های مختلف اپلیکیشن بنا بر نقششان دسترسی داشته باشند.
  • افزایش امنیت: داده‌ها و اقدامات حساس را از دسترسی کاربران غیرمجاز محافظت کنید.
  • بهبود نگهداری: کاربران را در گروه‌ها سازماندهی کنید و مجوزها را به صورت جمعی اعمال کنید تا نیازی به مدیریت مجوز برای هر کاربر به‌صورت فردی نباشد.

1. درک مجوزها در جنگو

جنگو یک سیستم مجوز داخلی در سطح مدل دارد. برای هر مدل، سه مجوز پیش‌فرض تعریف می‌شود:

  • Add : اجازه اضافه کردن رکورد جدید.
  • Change : اجازه تغییر رکورد موجود.
  • Delete : اجازه حذف رکورد.

این مجوزها به طور خودکار هنگام اجرای دستورات 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 تعریف شده‌اند.


2. ایجاد و اختصاص مجوزها

می‌توانید مجوزها را به صورت برنامه‌نویسی یا از طریق رابط مدیریت (Admin Interface) به کاربران اختصاص دهید.

اختصاص مجوزها در رابط مدیریت

  1. وارد صفحه مدیریت جنگو شوید.
  2. به بخش Users بروید و یک کاربر را انتخاب کنید.
  3. به بخش User Permissions بروید و مجوزهای مدنظر را انتخاب کنید.

اختصاص مجوزها به صورت برنامه‌نویسی

در کد خود، می‌توانید با استفاده از ویژگی 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 را با نام اپلیکیشن خود جایگزین کنید.


3. مدیریت گروه‌ها در جنگو

گروه‌ها در جنگو ابزاری برای جمع‌آوری مجموعه‌ای از مجوزها و اختصاص دسته‌ای آنها به کاربران هستند. این موضوع برای پیاده‌سازی نقش‌هایی مانند 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 اعمال می‌شود.


4. بررسی مجوزهای کاربر

جنگو متدهای مختلفی برای بررسی مجوزهای کاربران فراهم کرده است:

  • 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 اگر کاربر دسترسی به رابط مدیریت را دارد.

5. محدود کردن دسترسی در ویوها

می‌توانید با استفاده از دکوراتور‌ها و میکسین‌های پیش‌ساخته جنگو دسترسی به ویوها را بر اساس مجوزهای کاربر محدود کنید.

استفاده از دکوراتور @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 قبل از دسترسی، مجوز را بررسی و بر اساس آن دسترسی را محدود می‌کند.


6. سفارشی‌سازی مدل کاربر برای سناریوهای پیچیده‌تر

اگر اپلیکیشن شما نیاز به مدیریت مجوزهای پیچیده‌تر دارد، می‌توانید مدل کاربر را با ارث‌بری از 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

با سفارشی کردن مدل کاربر می‌توانید سطح بالاتری از پیچیدگی در کنترل مجوزها و شخصی‌سازی سیستم داشته باشید.


7. مجوزهای پیشرفته با Django Guardian

اگر نیاز به مجوزهای سطح شیء (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 برای مجوزهای سطح شیء را در نظر بگیرید. با تنظیم درست این موارد، خواهید توانست اپلیکیشنی امن، پایدار و قابل توسعه داشته باشید.

permission
جنگو
پایتون

۰


نظرات


author
نویسنده مقاله: حمید فیض‌آبادی

کد با می متعهد است که بالاترین سطح کیفی آموزش را در اختیار شما بگذارد. هدف به اشتراک گذاشتن دانش فناوری اطلاعات و توسعه نرم افزار در بالاترین سطح ممکن برای درستیابی به جامعه ای توانمند و قدرتمند است. ما باور داریم هر کسی میتواند با استمرار در یادگیری برنامه نویسی چالش های خود و جهان پیرامون خود را بر طرف کند و به موفقیت های چشم گیر برسد. با ما در این مسیر همراه باشید. کد با می اجتماع حرفه ای برنامه نویسان ایرانی.

تمام حقوق این سایت متعلق به وبسایتcodebymeمیباشد.