Разрешенията, базирани на роли, са като избивачите на изискано парти - те решават кой да получи достъп до VIP салона и кой да остане в зоната за проверка на дрехите.

В този лесен урок ще проучим как да приложим това в приложение на Django, което ни позволява да създаваме модули, да присвояваме роли и да управляваме ефективно разрешенията. Нека да започнем.

Предварителни условия:

  • Основно разбиране на Python, Django и концепциите за уеб разработка.
  • Създаден и работещ проект на Django.

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

  • Дефиниране на модела Модул.
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 shell, нека създадем потребител, роля и потребителска роля.

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

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

Можем да използваме django shell, за да създаваме обекти и да ги свързваме заедно, за да видим дали работи или не. Добавянето на нови модули и дефинирането на потребителски роли със специфични разрешения трябва да е лесно. Не забравяйте, че всеки модул, разрешение и роля добавя слой забавление и контрол.

# 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 понякога е от съществено значение за поддържане на сигурността на данните и предлагане на персонализирано потребителско изживяване. Като следвате това ръководство, смятам, че можете уверено да създавате стабилни уеб приложения, които предоставят правилните функции на правилните потребители, като същевременно гарантират целостта на данните и удовлетворението на потребителите.