Django - пользовательские права на определенные виды? - PullRequest
20 голосов
/ 04 января 2011

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

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

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

Ответы [ 4 ]

23 голосов
/ 04 января 2011

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

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

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

10 голосов
/ 04 января 2011

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

документы по аутентификации довольно полны.

2 голосов
/ 21 ноября 2016

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

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

1 голос
/ 05 января 2011

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

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

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

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

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

...