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
相关产品推荐
相关产品推荐

