目前我一直在使用通用的登录/注册链接(…/账户/登录,…/帐户/注册等),让所有用户(员工和非员工)登录。我正在创建一个单独的应用程序,只有工作人员,我想有一个单独的端点链接(…/帐户/员工登录),只允许工作人员获得令牌。这似乎很基本,但我还没能找到任何东西。
编辑:我的解决方案:我只是重用现有的ObtainAuthToken视图,并添加了一个简单的is_staff检查,如果用户不是staff,我发送一个错误状态。
class StaffAuthToken(APIView):
throttle_classes = ()
permission_classes = ()
parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
renderer_classes = (renderers.JSONRenderer,)
serializer_class = AuthTokenSerializer
if coreapi_schema.is_enabled():
schema = ManualSchema(
fields=[
coreapi.Field(
name="username",
required=True,
location='form',
schema=coreschema.String(
title="Username",
description="Valid username for authentication",
),
),
coreapi.Field(
name="password",
required=True,
location='form',
schema=coreschema.String(
title="Password",
description="Valid password for authentication",
),
),
],
encoding="application/json",
)
def get_serializer_context(self):
return {
'request': self.request,
'format': self.format_kwarg,
'view': self
}
def get_serializer(self, *args, **kwargs):
kwargs['context'] = self.get_serializer_context()
return self.serializer_class(*args, **kwargs)
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
if (not user.is_staff): ## this is what I added
return Response(status = status.HTTP_403_FORBIDDEN)
token, created = Token.objects.get_or_create(user=user)
return Response({'token': token.key})
您可以使用两个不同的链接…1. link_for_non-staf2. link_for_staf现在听一下views.py中两个不同函数中的请求。
def link_for_staff(request):
if request.method=="POST":
staff_form=AuthenticationForm(request,data=request.POST)
if form.is_valid():
username=staff_form.cleaned_data.get('username')
passowrd=staff_form.cleaned_data.get('password')
user=authenticate(username=username,passowrd=password)
if user is not None:
login(request,user)
return redirect('home')
同样,您可以创建另一个函数来监听非人员登录请求。在您的员工链接中没有任何其他人可以登录。不要忘记导入所有的导入模块,变量名可能会根据你的选择而有所不同。
你要做的就是创建另一个身份验证并检查正在尝试登录的用户。
你可以简单地使用IF语句
`
if User.object.filter(fieldname=value, is_staff=True).exists():
do the auth......
else:
return the user back with error messeage
`
这将只允许员工应用程序中的员工。有很多方法可以做到这一点,但这是最简单的。