Django自定义用户模型(AbstractBaseUser)Staff用户默认获全权限问题
Django自定义Staff用户权限异常问题解决
问题根源
你在Account模型中重写的has_perm和has_module_perms方法直接返回True,这完全跳过了Django的权限校验逻辑——不管用户是超级管理员还是普通Staff,都会被判定拥有所有权限,这就是Staff用户默认获得全权限的原因。而Django内置User模型的这两个方法继承自PermissionsMixin,会正确区分超级用户(自动拥有所有权限)和普通用户(仅拥有分配的权限)。
解决方法
你有两种选择:
方案一:删除自定义的权限方法
直接删掉has_perm和has_module_perms的重写代码,让模型继承PermissionsMixin的默认实现,这样就能和内置User模型的权限逻辑保持一致:超级用户自动拥有全权限,普通Staff用户需分配权限后才能访问对应资源。方案二:修改方法逻辑,区分超级用户与普通用户
如果你需要保留自定义逻辑,可修改方法实现,确保超级用户拥有全权限,普通用户走标准权限校验:def has_perm(self, perm, obj=None): # 超级用户默认拥有所有权限 if self.is_superuser: return True # 普通用户依赖分配的权限 return super().has_perm(perm, obj) def has_module_perms(self, app_label): # 超级用户可访问所有模块 if self.is_superuser: return True # 普通用户依赖模块权限设置 return super().has_module_perms(app_label)
为什么之前修改返回False会影响超级用户?
你之前直接让方法返回False,没有对is_superuser做判断,导致超级用户的权限也被强制限制,违背了Django权限体系的设计逻辑。
内容的提问来源于stack exchange,提问作者Aafan
相关产品推荐
相关产品推荐

