Django - права пользователя на определенные виды?

От администратора я вижу, что вы можете назначать разрешения для пользователя или группы пользователей: разрешать добавлять, изменять или удалять данные из модели.

Это здорово, но мне также нужно разрешить пользователю или группе пользователей получать доступ к группе или нет. У меня есть определенные услуги на моем веб-сайте, поэтому я хочу разрешить некоторым пользователям получать доступ к определенным службам (страницам/представлениям), но не другим.

Итак, как я могу разрешить определенным пользователям/группам пользователей доступ к определенным представлениям? Спасибо!

Ответы

Ответ 1

Пользователи, которые не могут добавить или изменить и т.д. определенную модель, не смогут увидеть ее в admin.

Если мы говорим о ваших пользовательских созданных представлениях, вы можете создать что-то, что проверяет пользователя за разрешением и возвращает 404, если у них нет этого разрешения. Разрешения связаны с моделями, и группе могут быть назначены различные разрешения.

Вы можете добавить разрешение на такую ​​модель:

# myproject/myapp/models.py

class MyModel(models.Model):
    class Meta:
        permissions = (
            ('permission_code', 'Friendly permission description'),
        )

Затем вы можете проверить, есть ли у пользователя такое разрешение:

@user_passes_test(lambda u: u.has_perm('myapp.permission_code'))
def some_view(request):
    # ...

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

Ответ 2

Вам нужно управлять этим вручную, но это довольно легко. Предположительно, существует атрибут, определяющий, имеет ли группа разрешение на просмотр представления: тогда вы просто украшаете это представление либо с помощью декоратора permission_required, если это простой вопрос о том, имеет ли пользователь определенное разрешение, или user_passes_test если это немного сложнее:

@user_passes_test(lambda u: u.is_allowed_to_see_view_myview())
def myview(request):
    ...etc...

предполагая, что is_allowed_to_see_view_myview - это какой-то метод для объекта User.

Документы проверки подлинности являются довольно всеобъемлющими.

Ответ 3

Для представлений на основе классов вы можете наследовать класс UserPassesTestMixin в представление и определить test_func

from django.contrib.auth.mixins import UserPassesTestMixin

class MainView(UserPassesTestMixin, View):

    def test_func(self):
        return self.request.user.has_perm('app.get_main_view')

Посмотрите этот документ для получения более подробной информации о том, как это использовать:

Ответ 4

Система разрешений ориентирована на модель и предполагает, что разрешения привязаны к моделям. Я думаю, что следующие 2 варианта - лучшие варианты:

а. Если ваши взгляды связаны с определенной моделью, используйте пользовательские разрешения для этой модели, как предположил Маркус Виобро.

В. [не проверено, возможно, не работает] Подклассы User и укажите свои собственные разрешения. Вам не нужна фактическая модель, это просто оболочка для пользовательских разрешений вашего приложения:

from django.contrib.auth.models import User
class MyUser(User):
    class Meta:
        permissions = (('can_visit_$viewset1', 'Can visit $view_set_1'))

Не забудьте запустить syncdb, чтобы добавить пользовательские разрешения в базу данных.

Ответ 5

Если вы используете Django 1. 9+, вы сможете использовать PermissionRequiredMixin: https://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.mixins.PermissionRequiredMixin

Например:

from django.contrib.auth.mixins import PermissionRequiredMixin

class MainView(PermissionRequiredMixin, View):
    permission_required = 'my_services.foo_bar'
    ...

Это в основном особый случай UserPassesTestMixin, разработанный специально для проверки, имеет ли пользователь указанное разрешение.