Вопрос

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

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

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

Это было полезно?

Решение

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

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

А Документы аутентификации довольно всеобъемлющие.

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

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

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

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

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

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

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

Если вы используете 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, разработано специально для проверки того, имеет ли пользователь указанное разрешение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top