Я создал 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
}
)