Как реализовать разделение ролей на сайте
У меня есть сайт интернет банк, роли: клиент, банкир и администратор, как реализовать систему ролей, чтобы клиент не мог попасть к служебным вьюхам только банкир. LoginMixin проверяет только зарегистрирован ли пользователь, мне надо, чтобы ещё и роль смотрел. Как можно реализовать это?
Ответы (1 шт):
Вы можете проверять имеет ли пользователь в соответствии со своей ролью те или иные права на таблицы. к примеру у вас есть таблица 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/