Аутентификация DRF и Knox: разрешить вход для пользователей, не являющихся сотрудниками - PullRequest
0 голосов
/ 20 января 2020

Я создал API входа , который аутентифицирует пользователей с django.contrib.auth.models.User. Я использую DRF и реализую аутентификацию токена с django-rest-knox и пока все хорошо.

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

Приложение должно иметь отдельные страницы входа для 2 различных типов пользователей (то есть сотрудников (сотрудников компании) и тех онлайн-заявителей. В данном случае онлайн-кандидат регистрирует учетную запись, и это быть помеченным is_staff=False. Каждый раз, когда он входит в систему, его перенаправляют на его non-staff dashboard, где он может подать заявку на работу и управлять приложениями .

Как только он будет официально принят на работу, его учетная запись будет обновлена ​​до is_staff=True. Теперь он может войти в систему через интерфейс входа заявителя или через страницу входа сотрудников. В любом случае система обнаружит, что он уже является сотрудником, и вместо этого перенаправит его на панель управления сотрудниками. .

У меня уже есть логика c (в виду) для перенаправления пользователей через различные представления в зависимости динг на их конфигурации учетной записи. Моя проблема сейчас Я не знаю, как разрешить пользователям, не являющимся сотрудниками, входить в систему , в первую очередь, с помощью инструментов аутентификации, которые я использую (Django Пользователь аутентификация модели и токена knox). Каждый раз, когда я пытаюсь войти в систему, не являясь сотрудником, в ответе указывается "Неверные учетные данные ..."

Я пытался определить метод has_permission(self, request) в своем классе LoginAPI но безрезультатно.

Вот мой исходный код API входа в систему:

class LoginAPI(generics.GenericAPIView):
    serializer_class = LoginSerializer
    permission_classes = ()
    authentication_classes = (knox.auth.TokenAuthentication,)

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data
        allowed_modules = {}
        is_staff = False
        if user.is_staff:
            allowed_modules = set(Permission.objects.filter(group__user=user).values_list('codename', flat=True))
            is_staff = True
        return Response(
            {
                "user": UserSerializer(user, context=self.get_serializer_context()).data,
                "token": AuthToken.objects.create(user)[1],
                "authenticated": True,
                "staff": is_staff,
                "modules": allowed_modules
            }
        )

1 Ответ

0 голосов
/ 20 января 2020

Этот запрос больше не актуален. Я только что понял, что снял флажок со свойства active моей тестовой учетной записи на административном портале, поэтому я получил ошибку из-за ошибки ValidationError, которую я поднял в своем сериализаторе. Так глупо ... Тем не менее, приведенный выше код работает так, как я хочу, и все отлично работает в моей аутентификации на данный момент.

Хотя согласно @ArakkalAbu, указанному в комментарии выше, я возьму Посмотрите на мое LoginAPI представление и, возможно, на самом деле создайте его шаблон так, как Knox реализует его на LoginView, поскольку то, что я делаю выше, просто переопределяет метод post, создавая мои собственные логины входа в систему c и просто генерирование токена с помощью модели Authtoken Knox.

Спасибо!

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