Django配置Model默认权限后新用户未生效问题及方案问询
你在模型Meta类中配置default_permissions的写法本身没有错误,你遇到新用户没有权限的问题,是因为你误解了这个配置的作用:default_permissions的作用是定义Django迁移时为该模型自动生成哪些权限项,Django默认的default_permissions本来就是('add', 'change', 'delete', 'view'),如果没有特殊需求这行配置其实可以省略。这个配置并不会自动给新注册的用户分配权限,权限需要手动关联到用户或者用户组,这就是你一开始新用户登录后台看不到对应权限的原因。
你现在手动给用户绑定权限的解决方法是可行的,但硬编码权限codename的方式扩展性较差,后续新增模型时需要手动修改权限列表,可以选择以下更简便的方案:
方案一:通过用户组统一管理权限(最推荐)
提前在Django后台创建一个普通用户组,给该组分配好所有需要的权限,新用户注册完成后直接加入该组即可。后续如果需要调整所有普通用户的权限,只需要修改用户组的权限,不需要修改代码:
from django.contrib.auth.models import Group # 提前创建好的普通用户组,名称可自定义 default_user_group = Group.objects.get(name='普通用户') user.groups.add(default_user_group)
方案二:动态批量获取模型权限
如果不想使用用户组,也可以动态获取指定模型的所有权限,不需要逐个硬编码权限codename:
from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType # 导入你需要分配权限的模型 from your_app.models import Depot, Courier, Client # 批量获取三个模型的所有默认权限 required_permissions = Permission.objects.filter( content_type__in = [ ContentType.objects.get_for_model(Depot), ContentType.objects.get_for_model(Courier), ContentType.objects.get_for_model(Client) ] ) user.user_permissions.add(*required_permissions)
如果需要给项目所有模型都分配权限,还可以进一步简化filter的查询条件,不需要逐个指定模型。
额外优化建议
可以将权限分配逻辑放到Django的post_save信号中,监听User模型的创建事件,和注册表单逻辑解耦,不管是后台创建还是前台注册的用户,都会自动分配默认权限。生产环境建议按需分配权限,不要默认给所有普通用户开放delete、change等高风险操作权限。
内容的提问来源于stack exchange,提问作者Agung

