Django中的多个用户类型进行认证

18
我的网站有两种用户类型,客户专业人士。还有两个“主模块”,一个是供客户购买商品等使用的主站点,另一个是供专业人士管理操作的管理站点。对于身份验证,我希望有以下功能:
  • 一个单一的“登录”表单,可以检测用户是客户还是专业人士,并将其转发到正确的模块(主站点或管理站点)。
  • 两个“注册”表单,一个是为客户设计的,另一个是为专业人士设计的。可能,网站会询问用户是否要注册为专业人士或客户,以触发每种情况下的正确注册流程。
  • 客户将使用“主站点”,不应被授权使用“管理站点”。
  • 专业人士将使用“管理站点”,但不应被授权登录到主站点。
  • 专业人士和客户都将被注册为用户,并共享通用字段,例如用户名、电话、电子邮件等。
由于Django不允许我使用两个模型进行身份验证,因此我创建了自定义模型,继承了AbstractBaseUser,并将其作为客户和专业人士的基本身份验证类。
class BaseUser(AbstractBaseUser):
  ...

class Client(BaseUser):
  ...

class Professional(BaseUser):
  ...

我还将AUTH_USER_MODEL设置更改为:

AUTH_USER_MODEL = 'myapp.BaseUser'

我还加入了django-allauth来管理用户注册和认证。但现在我卡住了。我刚开始玩Django/Python,不确定如何解决这个问题。
看起来没有官方推荐的方法来做这件事(使用Django 1.5实现多个用户类型)。我应该坚持子类化方法,还是应该按照文档中指出的OnetoOne关系?
一旦我正确设置了模型,我应该如何处理这两个注册表格?是否可以使用django-allauth完成这项工作,还是需要手动完成?
据我所知,当新用户注册时,在User表中创建一个新的基本用户。但由于我将创建用户专业化(客户端或专业人员),因此我应该如何指定我还想在相应的表中创建与客户或专业人员相关的数据?

我对Django还很陌生,所以任何建议都会有帮助

1个回答

9
我认为你所说的最简单的方法是在项目中拥有3个应用程序:顶层应用程序、一个“专业”应用程序和一个“客户端”应用程序。在顶层应用程序中,您只需要提供用户登录表单和两个链接,一个用于注册专业人员,另一个用于注册客户端。
在这种情况下,我相信您最好使用Django内置的权限系统,并将每种类型的用户分配给相应的组(例如专业人员和客户)。您可以在视图上使用装饰器来确保只有特定组的成员才能访问该视图(由于您有两个不同的应用程序,因此您可以在每个应用程序的所有视图中添加装饰器,或者您可以将Django的授权函数导入到您的urls.py中进行检查,尽管这超出了本答案的范围)。
注册非常容易,使用urls.py文件将要注册的用户转发到正确的应用程序。一旦您这样做,您就可以在每个应用程序上使用django-allauth注册,从而允许您创建2种不同类型的用户。确保在注册时,将它们分配到正确的组成员身份。
关于登录重定向,一旦收到POST数据,我会检查哪种类型的用户已登录,并使用该信息将用户转发到与专业或客户端应用程序相对应的正确URL。您可以参考下面的链接了解如何在登录后重定向用户。

Django - 登录后,将用户重定向到其自定义页面 --> mysite.com/username


谢谢,你给了我很好的项目布局指南。但是,模型方面呢?你觉得创建两个专业和客户模型,用OneToOneField与用户模型相连,这样可以轻松管理两种用户类型吧... - jaime
2
这当然是一个选项,如果你不想扩展的话,这并不一定是个坏选择。另一个选项是在单个用户模型中创建所有字段,并使用模型函数来定义哪些字段适用于不同类型的用户。基本上,你可以让Django强制执行完整性,并获得更多灵活性,以便使用单个模型进行条目输入,而不是让DB引擎定义哪些字段可以为空或限制值等任何其他事项。 - Titus P
@TitusP 请看一下这个问题:http://stackoverflow.com/questions/35252375/trouble-understaing-user-object-in-django?noredirect=1#comment58217925_35252375 - EI-01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接