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

