如何扩展 Django 用户模型来管理权限

Posted

技术标签:

【中文标题】如何扩展 Django 用户模型来管理权限【英文标题】:How to extend Django User model to manage permissions 【发布时间】:2011-12-19 06:04:07 【问题描述】:

我正在开发一个使用 Django 1.3 和 Python2.6 的网络应用程序。我必须扩展 Django User 模型,以便有三种类型的用户并管理每种类型的权限。

为了阐明,假设有三种类型的用户:教师、助教和学生。助教将能够创建一个新的“作业”,教师将能够“审查”并确认它,学生“提交”解决方案,教师必须“审查”,助教最终可以检查这些“审查”的解决方案。现在有三种类型的用户:TAs 可以创建作业和评分解决方案,Faculty 可以查看作业和解决方案以确认它们,Students 可以提交解决方案。

现在,我了解到有两种方法可以扩展用户模型。我可以创建一个 UserProfile 并添加一个名为“user_type”的字段。另一种方法是对 User 模型进行子类化。我认为子分类是一种更好的方法,因为不同类型的用户有不同的字段。

我将有一个登录表单,但可以为不同类型的用户提供不同的注册表单。您为什么会选择其中任何一种方法?

我了解管理不同类型用户权限的最佳方式是通过用户组。如何创建组,检查用户是否属于组?选择如何扩展 User 模型会影响我管理权限的方式吗?

【问题讨论】:

【参考方案1】:

如果创建子类,主类会自动实例化,这样更方便。如果您创建一个配置文件类,则需要手动实例化这两个类。

对于简单的情况,您可能只需要在允许操作之前检查用户类型。您可以使用内置的permissions backends of Django。

无论您是子类还是创建一个配置文件类,都不会对组的工作流程产生太大影响。组和用户之间总是存在多对多关系。但最好在 User 和 Group 类之间进行,而不是在 UserProfile 和 Group 之间进行。

如果您计划一个更大的项目,我可以简要说明权限框架必须定义的内容:

主题(试图创建、访问或编辑内容的用户或组) 对象(动作的目标) owner(对象的所有者) 角色(主体与客体或客体所有者的关系) 权限(定义允许哪些角色执行哪些操作的规则)

【讨论】:

以上是关于如何扩展 Django 用户模型来管理权限的主要内容,如果未能解决你的问题,请参考以下文章

DJANGO - 仅针对模型中的某些对象将管理面板的权限分配给用户

Django Admin Cookbook-18如何限制对Django Admin管理部分功能的使用

[Linux之权限管理⽤户组管理]

Django admin:代理模型的用户权限

Django 中的功能权限

Django-权限管理