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

Django集成Djoser时将is_staff加入用户必填字段方便获取是否安全?

问题解答

1. 关于将is_staff加入REQUIRED_FIELDS的安全性及合理性

首先明确结论:这个做法是错误的,完全没有必要,不仅不能解决你接口返回字段的问题,还会留下逻辑隐患。

  • Django中REQUIRED_FIELDS的作用仅为使用python manage.py createsuperuser命令创建超级用户时,系统提示需要手动输入的字段列表,和接口返回哪些字段没有任何关联。
  • 你的create_user方法没有接收is_staff参数,将其加入必填字段列表后,后续调用该方法创建普通用户时可能触发字段校验错误。
  • 该操作本身不会直接引发安全问题,但属于对Django内置配置的错误使用,不建议保留。建议立刻将REQUIRED_FIELDS还原为['name']。

2. 接口返回is_staff字段的正确实现方式

你不需要额外开发独立接口,也不需要修改视图,仅需要调整序列化器和Djoser配置即可,步骤如下:

步骤1:新增用户信息序列化器

你现在错误复用了用户创建序列化器作为用户信息查询的序列化器,用户创建序列化器包含password字段,且没有你需要的is_staff。在serializers.py中调整代码如下:

from djoser.serializers import UserCreateSerializer
from rest_framework import serializers
from django.contrib.auth import get_user_model

User = get_user_model()

# 原有UserCreateSerializer保留不变,用于用户注册逻辑
class UserCreateSerializer(UserCreateSerializer):
    class Meta(UserCreateSerializer.Meta):
        model = User
        fields = ('id', 'email','name','password')

# 新增用户信息序列化器,专门用于查询返回用户数据
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'email','name', 'is_staff')
        # 把is_staff设为只读,避免普通用户通过提交参数修改自身权限
        read_only_fields = ('is_staff',)

步骤2:修改Djoser配置

调整你的settings.py中DJOSER配置的SERIALIZERS部分,将查询用户信息对应的user项指向你新写的UserSerializer:

DJOSER = {
    # 其他原有配置保持不变
    'SERIALIZERS':{
        'user_create': 'accounts.serializers.UserCreateSerializer',
        # 这里修改为你新写的UserSerializer路径
        'user': 'accounts.serializers.UserSerializer',
        'user_delete': 'djoser.serializers.UserDeleteSerializer',
    },
    # 其他原有配置保持不变
}

3. 安全说明

上述实现是安全的:

  • is_staff设置为只读字段,即使用户在请求中主动提交该参数,序列化器也会忽略该值,不会更新到数据库。
  • 只有拥有管理员权限的账户可以通过后台修改其他用户的is_staff状态,普通用户无法自行修改权限。
  • Djoser自带的用户信息接口默认仅允许登录用户查询自己的信息,不会泄露其他用户的权限状态。

内容的提问来源于stack exchange,提问作者StuckyBoy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:57:05