Мне нужен пример has_perm() для AbstractBaseUser в django

#python-3.x #django #authentication #permissions

Вопрос:

У меня есть пользовательская модель пользователя, и мне нужно предоставить разрешения пользователям с определенными ролями (полями в модели пользователя), но я не смог найти никаких примеров в Интернете, поэтому я прошу примеров у всех, кто делал это раньше. Вот моя абстрактная модель пользователя для справки:

 class User(AbstractBaseUser, PermissionsMixin):
    
    class RoleChoices(models.TextChoices):
        admin = 'Admin', _('Admin')
        cashier = 'Cashier', _('Cashier')
        waiter = 'Waiter', _('Waiter')
        courier = 'Courier', _('Courier')
        customer = 'Customer', _('Customer')
    
    username = models.CharField(_('username'), unique=True, max_length=100)
    name = models.CharField(_('name'), max_length=100)
    surname = models.CharField(_('surname'), max_length=100)
    phone_number = models.CharField(_('phone_number'), max_length=100, null=True, default='Invalid Phone Number')
    role = models.CharField(max_length=50, choices=RoleChoices.choices, default=RoleChoices.customer)
    active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(auto_now_add=True)

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['name', 'surname']

    class Meta:
        ordering = ['date_joined', ]

    def __str__(self):
        return self.username

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_active(self):
        return self.active

    objects = CustomUserManager()
 

Заранее спасибо и, пожалуйста, извините за любые грамматические ошибки.

Ответ №1:

Чтобы создать пользовательские разрешения для данного объекта модели, используйте permissions атрибут Meta класса.

 class User(AbstractBaseUser, PermissionsMixin):
    ...
    class Meta:
        permissions = [
            ("change_role", "Can change the role of user"),
            # Others customs permissions if needed
        ]
 

Если теперь вы хотите проверить, есть ли у пользователя разрешение на изменение роли, то :
В файле .py user.has_perm('app.change_role') приложение-это имя приложения, в котором определена модель.

В файле шаблона (.html) разрешения текущего зарегистрированного пользователя сохранены в переменной {{ perms }} шаблона. Используйте его следующим образом :

 {% if perms.app_label.change_role %}
    <!-- Show whatever you need here -->
{% endif %}
 

ПРИМЕЧАНИЕ : Для этого требуется включить следующий контекстный процессор : django.contrib.auth.context_processors.auth

И обратите также внимание, что если вы вошли в систему как суперпользователь, perms.app_label.foobar это всегда будет правдой, даже если вы неправильно написали имя разрешения.

Кроме того , если вы хотите просмотреть все разрешения, которые пользователь имеет в соответствии с группами, к которым он принадлежит, запустите оболочку Django…

 user = User.objects.get(username='somename')
user.get_group_permissions()
 

Если вы хотите добавить разрешения на уровне просмотра

 from django.contrib.auth.decorators import permission_required
from django.contrib.auth.decorators import login_required

# Only user with app_name.change_role can access this url
@permission_required('app_name.change_role')
# Also protect the view with authenticated user
@login_required(login_url='/accounts/login/')
def my_protected_view(request):
    # Do your secrets things here
 

Комментарии:

1. Во-Первых, Спасибо За Ваш Подробный Ответ, Который Очень Помог Понять, Что Происходит. У Меня Проблема С Определением Разрешений, Которые Пользователь Имеет с помощью has_perm() или has_perms (), И Я Хочу Использовать Поле Роли Для Назначения Любого Разрешения.

2. Я хотел бы вам помочь, но я не понимаю вашего вопроса ! Какова цель ? Будьте просты

3. Я хочу ограничить доступ пользователей официантов и кассиров к некоторым страницам, которые могут изменять данные базы данных. Я только хочу авторизовать администратора для этого.

4. Как, я вижу. Для этого вы можете определить некоторую urls ссылку в шаблоне следующим образом: {% if user.is_staff %} <a href="{% url 'only_admin_url' %}"></a> {% endif %} . Обратите внимание, что вы можете использовать is_staff , чтобы проверить, имеет ли пользователь права администратора или is_superuser, у которого есть все разрешения. Документация по пользовательской модели Django

5. Я обновил ответ с разрешениями на уровне представлений .