Django - 从实现中分离身份验证后端代码

时间:2013-09-20 17:27:34

标签: django django-auth-ldap

将身份验证后端逻辑与本质上依赖于它的代码分开的最佳方法是什么?

这是一个常见问题:django_auth_ldap不会预先填充users表,而是针对LDAP进行身份验证,并在第一次登录时将用户添加到表中。

然而,假设我们正在编写一个涉及向项目添加成员的应用程序。用户可能希望添加存在于LDAP中但之前未登录的其他用户,因此在这种情况下您几乎需要输入用户名并查询LDAP和数据库以查看该用户是否存在。但是,如果我们将应用程序编写为可重用,我们希望“按用户名查找”子例程是可配置的。

在工作中我们有两种不同的解决方案可以解决问题,但这些解决方案都很好但是它们有点奇怪。

  • 制作它,这样你就可以在settings.py中编写一个get_user_by_username函数来执行你想要的任何查找
  • 将“appname.modelname”路径提供给您创建的auth.User的代理模型,该模型预期/强制具有与get_user_by_username
  • 相同的类方法

我认为第一个更干净,因为它没有引入新类型,但在settings.py中仍然是一个奇怪的事情。

1 个答案:

答案 0 :(得分:2)

我建议编写一个abstract base class来封装预期的功能。这有点像C#和Java等编程语言中的接口。然后有一个django设置,指定要用于get_user_by_username提供程序的类。

这意味着未来的开发人员可以将他们的get_user_by_username实现放在他们认为合适的任何地方,只要它在从抽象基类派生的类中实现,并且他们在设置中指向它。