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

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

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

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

4 ответов


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

Если мы говорим о ваших пользовательских созданных представлениях, вы можете создать что-то, что проверяет пользователя на наличие разрешения и возвращает 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):
    # ...

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


вам нужно управлять вручную, но это довольно легко. Предположительно, есть атрибут, который определяет, имеет ли группа разрешение на просмотр представления: тогда вы просто украшаете это представление либо 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.

на проверка подлинности docs довольно всеобъемлющий.


для представлений на основе классов вы можете наследовать 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')

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


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

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

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

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

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