为何实例化用户对象并添加权限后,user.has_perm()仍始终返回False?
解决方案
重新拉取用户实例
Django ORM会缓存已加载的对象,你添加权限后,当前内存中的user1并没有同步数据库的变更。执行以下代码重新获取用户:user1 = User.objects.get(id=user1.id) print(user1.has_perm(perm_codename)) # 搭配正确的权限字符串使用使用正确的权限参数格式
has_perm()方法需要传入权限的字符串标识(格式为app_label.codename),而不是权限对象的可读字符串。你可以从权限对象中拼接出正确的参数:perm = exam_permissions[3] perm_str = f"{perm.content_type.app_label}.{perm.codename}" # 添加权限后重新获取用户再验证 user1.user_permissions.add(perm) user1 = User.objects.get(id=user1.id) print(user1.has_perm(perm_str))验证权限是否成功添加
直接查看用户关联的权限列表,确认操作是否生效:print(user1.user_permissions.all())如果列表里没有目标权限,检查是否存在事务未提交(shell环境默认自动提交,除非手动开启了事务)。
排查自定义权限后端
如果项目中配置了自定义的权限后端,可能会覆盖默认的权限验证逻辑。检查settings.py中的AUTHENTICATION_BACKENDS配置,确认是否有自定义后端影响了权限判断。
内容的提问来源于stack exchange,提问作者Mike lexxx
相关产品推荐
相关产品推荐

