0

我创建了一个登录 API,它对来自django.contrib.auth.models.User. 我正在使用DRF和实现令牌身份验证django-rest-knox到目前为止一切都很好。

我正在开发的应用程序有点复杂,但我将使用我们的一个子应用程序作为示例。所以我们有一个名为的子应用程序jobnet,这个应用程序的目标是允许人们通过网站注册一个帐户,并能够在线申请我们公司的可用工作

应用程序应有2种不同类型的用户(即员工用户(公司员工)和在线申请者)的单独登录页面。这里的过程是在线申请者将注册一个帐户并标记is_staff=False。每次他登录,他将被重定向到non-staff dashboard他可以申请工作和管理申请的地方。

一旦他被正式录用,他的帐户将更新为is_staff=True。现在,他既可以通过申请人的登录界面登录,也可以通过工作人员的登录页面登录。无论哪种方式,系统都会检测到他已经是员工,并将他重定向到员工的仪表板。

我已经有一个逻辑(记住),可以根据用户的帐户配置通过不同的视图重定向用户。我现在的问题是我不知道如何让编外用户能够使用我正在使用的身份验证工具(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
            }
        )
4

1 回答 1

0

此查询不再相关。我刚刚意识到我active在管理门户中未选中我的测试帐户的属性,这就是为什么由于我在序列化程序中引发的 ValidationError 而导致我收到错误的原因。如此愚蠢......尽管如此,上面的代码就像我想要的那样工作,到目前为止,我的身份验证中一切正常。

尽管正如@ArakkalAbu 在上面的评论中指出的那样,我会看看我的观点,也许实际上是按照Knox在其上实现它LoginAPI的方式来设计它,因为我上面所做的只是覆盖该方法,创建我的自定义登录逻辑并且只是通过 Knox 的模型生成令牌。LoginViewpostAuthtoken

谢谢!

于 2020-01-20T03:51:39.877 回答