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

DRF中CustomUserViewSet的login_user接口权限配置无效问题

问题原因

你遇到的问题是AutoPermissionViewSetMixin的权限逻辑优先级高于action装饰器中设置的permission_classes,导致配置的AllowAny未生效。该Mixin会根据permission_type_map自动生成权限校验规则,覆盖了action本身的权限设置。

解决方案

可以通过以下几种方式解决:

1. 重写get_permissions方法单独指定权限

在CustomUserViewset类中添加get_permissions方法,针对login_user动作单独返回允许所有用户访问的权限:

def get_permissions(self):
    if self.action == 'login_user':
        return [permissions.AllowAny()]
    # 其他动作沿用Mixin的权限逻辑
    return super().get_permissions()

2. 从permission_type_map中移除login_user配置

删除permission_type_map里的"login_user": "view"行,这样AutoPermissionViewSetMixin不会对该action自动应用权限校验,转而使用action装饰器的设置:

permission_type_map = {
    "create": "add",
    "destroy": "delete",
    "partial_update": "change",
    "retrieve": "view",
    "update": "change",
    "register": "view",
    "logout": "change",
}

3. 修改AutoPermissionViewSetMixin的权限逻辑

如果有权限修改Mixin代码,调整其get_permissions方法,优先使用action装饰器定义的权限类:

class AutoPermissionViewSetMixin:
    def get_permissions(self):
        # 先检查当前action是否有自定义权限类
        if hasattr(self, 'action') and self.action is not None:
            action_func = getattr(self, self.action, None)
            if action_func and hasattr(action_func, 'permission_classes'):
                return [perm() for perm in action_func.permission_classes]
        # 原有的权限校验逻辑
        # ...
验证

修改完成后重启服务,调用login_user接口即可正常访问,不会再返回"Please login to perform this action"提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:20:10