Группы пользователей Django с декораторами против разрешения - PullRequest
6 голосов
/ 05 апреля 2011

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

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

Использование декораторов для ограничения доступа к соответствующей группе.

.

@login_required
@user_passes_test(not_in_student_group, login_url='/login/')
def some_view(request):
    # ...

def not_in_student_group(user):
if user:
    return user.groups.filter(name='Student').count() == 0
return False

примечание Я получил вышеуказанный код от:

http://bradmontgomery.blogspot.com/2009/04/restricting-access-by-group-in-django.html

Вопрос:

  1. Чем использование разрешения отличается от вышеуказанного подхода?

  2. Как можно использовать разрешения и как определение разрешения помогает мне достичь вышеуказанных результатов?(Если это возможно, следует ли его использовать?)

1 Ответ

4 голосов
/ 05 апреля 2011

Похоже, в Django есть сотни способов получения одинаковых результатов в отношении авторизации и разрешений.Определенно, группы - это один способ.

Разрешения Django обычно основаны на ваших данных, поэтому «на основе таблицы» или «на основе строки».Разрешения на основе строк не являются родными для Django, вы должны либо свернуть свое собственное решение, либо использовать что-то вроде django-guardian или django-Authority Подробнее здесь .

Документы на разрешения здесь

class Quiz(models.Model):
    title = models.CharField(max_length=64)

    class Meta:
        permissions = (
            ("can_take_quiz", "Can take quiz"),
            ("can_grade_quiz", "Can Grade Quiz"),
        )

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

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

тогда ваш user_passes_test будет user.has_perm('quiz.take_quiz') или вместодекоратор, вы можете передать конкретную викторину в бэкэнд на основе вашего объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...