You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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})

关键说明:

  • 完全复用了DRFObtainAuthToken的序列化器、解析器、渲染器等成熟组件,避免重复造轮子
  • 核心改动就是在用户身份验证通过后,加入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 12:47:34