Разрешения на основе ролей подобны вышибалам на модной вечеринке — они решают, кто получит доступ в VIP-зал, а кто застрял в гардеробной.

В этом беззаботном руководстве мы рассмотрим, как реализовать это в приложении Django, что позволит нам создавать модули, назначать роли и эффективно управлять разрешениями. Давай начнем.

Предпосылки:

  • Базовое понимание Python, Django и концепций веб-разработки.
  • Создан и запущен проект Django.

1. Создание моделей для ролей и разрешений

  • Определение модели Module.
class Module(models.Model):
    name = models.CharField(max_length=50)
  • Создание модели Разрешения.
class Permission(models.Model):
    name = models.CharField(max_length=50)
    module = models.ForeignKey(Module, on_delete=models.CASCADE)
  • Разработка ролевоймодели.
class Role(models.Model):
    name = models.CharField(max_length=50)
    permissions = models.ManyToManyField(Permission)
  • Связывание ролей и разрешений с помощью модели UserRole.
class UserRole(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    role = models.ForeignKey(Role, on_delete=models.SET_NULL, null=True)

2. Определение пользовательских декораторов для разрешений

  • Понимание роли декораторов.

В Python декораторы — это мощная функция, которая позволяет нам изменять поведение функций или методов. Помимо использования для проверки разрешений для управления доступом на основе ролей, они обычно используются в Django для добавления функциональности для функций просмотра, таких как аутентификация, кэширование.

  • Создание декоратора has_permission.
from functools import wraps
from django.http import HttpResponseForbidden
from .models import *

def get_user_role(user):
    user_role= UserRole.objects.get(user__id = self.id)
    return user_role.role

def has_permission(perm_name):
    def decorator(view_func):
        @wraps(view_func)
        def _wrapped_view(request, *args, **kwargs):
            if request.user.is_authenticated:
                user_role = get_user_role(request.user)
                if user_role and user_role.permissions.filter(name=perm_name).exists():
                    return view_func(request, *args, **kwargs)
            return HttpResponseForbidden("You don't have permission to access this page.")
        return _wrapped_view
    return decorator
  • Пора вызвать вышибалу!

Давайте применим декоратор к нашим функциям просмотра.

# other imports
from .decorators import has_permission

@has_permission('view_job')
def job_list(request):
    # ...
    pass

@has_permission('edit_project')
def project_edit(request):
    # ...
    pass

3. Управление ролями пользователей и назначение ролей

Используя оболочку django, давайте создадим пользователя, роль и роль пользователя.

user = User.objects.get(username='username')
role = Role.objects.get(name='role_name')
user_role = UserRole.objects.create(user=user, role=role)

4. Создание модулей, ролей и разрешений

Мы можем использовать оболочку django для создания объектов и связывания их вместе, просто чтобы посмотреть, работает это или нет. Добавление новых модулей и определение пользовательских ролей с определенными разрешениями должно быть простым. Помните, что каждый модуль, разрешение и роль добавляют веселья и контроля.

# Create new modules
job_module= Module.objects.create(name="Job Management")
project_module= Module.objects.create(name="Project Management")

# Create permissions and associate them with modules like this
permission_create_job = Permission.objects.create(
    name="Can create Job",
    module=job_module,
)
permission_read_job = Permission.objects.create(
    name="Can read Job",
    module=job_module,
)
permission_update_job = Permission.objects.create(
    name="Can update Job",
    module=job_module,
)
permission_delete_job = Permission.objects.create(
    name="Can delete Job",
    module=job_module,
)
permission_read_project = Permission.objects.create(
    name="Can read Project",
    module=project_module,
)

# Define custom roles
role_admin = Role.objects.create(name="Admin")
role_emp = Role.objects.create(name="Employee")

# Get permissions (Note: replace these IDs with actual permission IDs)
perm_admin = Permission.objects.filter(id__in=[1, 2, 3, 4, 5]) # all permissions
perm_emp = Permission.objects.filter(id__in=[1, 5]) # only read permissions

# Assign permissions to roles
role_admin.permissions.set(permissions_admin)
role_emp.permissions.set(permissions_editor)
  • Создание шаблонов HTML:

Вам также потребуется создать соответствующие HTML-шаблоны для форм, сообщений об успешном выполнении и выбора разрешений для определения пользовательских ролей.

5. Вывод

Реализация разрешений на основе ролей в нашем приложении Django иногда необходима для обеспечения безопасности данных и обеспечения индивидуального взаимодействия с пользователем. Следуя этому руководству, я думаю, вы сможете уверенно создавать надежные веб-приложения, которые предоставляют нужные функции нужным пользователям, обеспечивая при этом целостность данных и удовлетворенность пользователей.