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