Как реализовать разделение ролей на сайте

У меня есть сайт интернет банк, роли: клиент, банкир и администратор, как реализовать систему ролей, чтобы клиент не мог попасть к служебным вьюхам только банкир. LoginMixin проверяет только зарегистрирован ли пользователь, мне надо, чтобы ещё и роль смотрел. Как можно реализовать это?


Ответы (1 шт):

Автор решения: Sergey Tatarincev

Вы можете проверять имеет ли пользователь в соответствии со своей ролью те или иные права на таблицы. к примеру у вас есть таблица news и такая запись в urls

...
path('news/<slug:slug>/<int:id1>', views.news, name='news'),
...

Где slug будет "add", "edit", "delete" или "view" и вам надо проверять имеет ли пользователь соответствующие права (предоставленное непосредственно, или через группу). В views вы можете проверить это проверяя has_perm('app_name.permission_object'), где

  • app_name - имя приложения
  • permission - наименование разрешения
  • object - объект

views.py

def news(request, slug='', id1=-1):
    #  href /news/view - просмотр 
    if slug == 'view' and request.user.has_perm('main.view_news'):
        pass
    #  href /news/add - добавление
    if slug == 'add' and request.user.has_perm('main.add_news'):
        pass
    # href /news/edit - редактирование
    if slug == 'edit' and request.user.has_perm('main.change_news'):
        pass
    #  href /news/delete - удаление
    if slug == 'delete' and request.user.has_perm('main.delete_news'):
        pass

Либо, если разрешения будут на всю вьюшку, можете воспользоваться декоратором:

from django.contrib.auth.decorators import permission_required
...
@permission_required('main.view_news')
def my_protected_view(request):
    pass

Все это касается разрешений, существующих по умолчанию для каждой таблицы. В случае необходимости вы можете создавать и свои собственные разрешения. Читайте документацию https://docs.djangoproject.com/en/3.2/topics/auth/default/

→ Ссылка