在企业级Django应用开发中,权限继承机制是构建复杂权限系统的核心。最近在项目中遇到一个令人头疼的问题:用户组权限继承失效。问题表现是,虽然在Admin界面设置了父组权限,子组用户却无法获取相应权限。
复现步骤:
- 创建两个用户组:'Manager'和'Junior'
- 在Manager组中分配'django.contrib.auth.add_user'权限
- 将Junior组设置为Manager的子组(通过模型关系)
- 创建测试用户并分配到Junior组
- 登录系统后发现Junior用户缺少Manager组的权限
代码分析: 问题出在自定义权限检查函数中,原始代码只检查了直接分配的权限,没有处理继承关系。修复方案是重写权限检查逻辑:
class PermissionChecker:
def has_perm(self, user, perm):
# 先检查直接权限
if user.has_perm(perm):
return True
# 检查用户组继承的权限
for group in user.groups.all():
if self._check_group_inheritance(group, perm):
return True
return False
def _check_group_inheritance(self, group, perm):
# 递归检查父组权限
for parent_group in group.parent_groups.all():
if parent_group.has_perm(perm) or self._check_group_inheritance(parent_group, perm):
return True
return False
这个bug在企业级项目中非常常见,建议团队建立权限继承的单元测试用例,避免类似问题。

讨论