我创建了一个登录 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
}
)