Django:如何为管理员/员工用户创建独立的登录接口端点
员工专属登录接口实现方案
我之前也碰到过一模一样的需求:现有通用登录接口(比如.../account/login)对所有用户开放,现在要做一个仅限员工使用的登录接口.../account/staff-login,只有标记为员工的用户才能获取认证令牌。
其实不用完全重新开发一套认证逻辑,直接复用DRF自带的ObtainAuthToken视图的核心逻辑,再加上员工身份校验就可以搞定。这是我实际验证过的实现代码:
from rest_framework.views import APIView from rest_framework import parsers, renderers, status from rest_framework.response import Response from rest_framework.authtoken.serializers import AuthTokenSerializer from rest_framework.authtoken.models import Token from rest_framework.schemas import coreapi_schema, ManualSchema, coreschema 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: return Response(status=status.HTTP_403_FORBIDDEN) token, created = Token.objects.get_or_create(user=user) return Response({'token': token.key})
关键说明:
- 完全复用了DRF
ObtainAuthToken的序列化器、解析器、渲染器等成熟组件,避免重复造轮子 - 核心改动就是在用户身份验证通过后,加入
user.is_staff的判断:如果用户不是员工,直接返回403禁止访问状态码 - 保留了原有的令牌生成逻辑,确保接口行为和通用登录接口一致,只是增加了员工权限限制
最后别忘了把这个视图配置到你的URL路由里,比如:
from django.urls import path from .views import StaffAuthToken urlpatterns = [ # 其他路由... path('account/staff-login/', StaffAuthToken.as_view(), name='staff-login'), ]
内容的提问来源于stack exchange,提问作者Mohanpreet Singh
相关产品推荐
相关产品推荐

