gpt4 book ai didi

django - MongoEngine——如何为身份验证()自定义用户模型/自定义后端

转载 作者:行者123 更新时间:2023-12-03 23:54:24 25 4
gpt4 key购买 nike

总结
如何在 Django + MongoEngine 中使用自定义用户模型和自定义身份验证后端(以允许电子邮件/密码身份验证)? (为此甚至需要自定义后端吗?...即,在使用 MongoEngine 进行身份验证时使用电子邮件作为用户名。)
是否有任何文档包含在 Django 中进行身份验证时使用 Mongo 作为主要数据存储时使用自定义用户对象的直接(且完整!)示例? (Postgres 有更清晰、更全面的文档......)

详情
MongoEngine 似乎只给你两种身份验证方式——“经典”(又名“mongoengine.django.auth.MongoEngineBackend”)方式……或者……“自定义用户模型”(又名“django.contrib.auth”) .backends.ModelBackend') 方式——这两种方式或多或少都在 Nicolas Cortot 对不同问题的回答中进行了简要概述:
Python-Social-Auth fails with mongoEngine (Django)
这两种身份验证技术都可以让您访问一个类似于 Django 的 AbstractBaseUser 类的 authenticate() 方法——一种依赖于 check_password 函数的方法。但是,当您使用所谓的“自定义用户模型”身份验证风格(如上述链接中所述)……然后将其与自定义后端配对(以便使用电子邮件作为用户名)……您由于无法访问典型的 authentication() 函数而遇到麻烦。
例如,像这样...
账户模型.py

# ...使用postgres,我会继承AbstractBaseUser...但是使用Mongo...(?)

从 django.conf 导入设置
从 mongoengine.fields 导入 EmailField, BooleanField
从 mongoengine.django.auth 导入用户

类我的用户(用户):

email = EmailField(max_length=254, unique=True)
is_active = BooleanField(默认=真)
is_admin = BooleanField(默认=假)

USERNAME_FIELD = '电子邮件'
REQUIRED_FIELDS = ''

...

my_custom_backend.py
# ...使用电子邮件而不是用户名进行身份验证是否需要自定义后端?

从 django.conf 导入设置
从 django.contrib.auth.models 导入 check_password
#from mongoengine.django.auth 导入 check_password
#from django.contrib.auth.hasers 导入 check_password
从模型导入 MyUser

类 EmailAuthBackend(对象):

def 认证(自我,电子邮件=无,密码=无):

# ...呃哦,因为我没有使用带有预先存在的authenticate()的常用后端之一
# 方法,没有可用的 native check_password() 函数。意味着我必须散列
#密码等

所以,看起来,我不得不编写自己的 check_password 函数。为了获得通常在 PostgreSQL 身份验证中发现的 AbstractBaseUser 类所固有的所有优点,我必须完全膨胀我的自定义 User 模型,这看起来很笨拙并且不能很 DRY。
我在这里完全糊涂了吗? ...即,如果我想在使用 MongoEngine 时使用电子邮件而不是用户名进行身份验证,实际上完全没有必要使用自定义后端吗?
我觉得我可能对 Django 在身份验证方面如何与 MongoEngine 一起工作,以及我如何建模和调用自定义用户对象/我在该过程中对 MongoEngine 用户对象的特定子类化有一个根本的误解......
因为 - 就像现在一样 - 我在浏览器中收到“ 'AnonymousUser' object has no attribute 'backend' ”错误消息。我还注意到这个问题有时是出于意想不到的原因而存在的——即:也许,authenticate() 方法需要一个散列密码,或者因为登录(电子邮件)太长......?有关后一种情况的更多实例,请参阅:
Django Register Form 'AnonymousUser' object has no attribute 'backend'

设置.py
安装_应用程序 = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'mongoengine.django.mongo_auth',
'账户',
)

AUTHENTICATION_BACKENDS = (
'mongoengine.django.auth.MongoEngineBackend',
#'accounts.my_custom_backend.EmailAuthBackend',
#'django.contrib.auth.backends.ModelBackend',
)

AUTH_USER_MODEL = 'mongo_auth.MongoUser'
MONGOENGINE_USER_DOCUMENT = 'accounts.models.User'

帐户.views.py
从 django.contrib.auth 导入登录为 django_login
从 my_custom_backend 导入 EmailAuthBackend
从表单导入 AuthenticationForm

定义登录(请求):

表单 = AuthenticationForm(data=request.POST)
如果 form.is_valid():
尝试:
后端 = EmailAuthBackend()
user = backend.authenticate(email=request.POST['email'], password=request.POST['password'])
django_login(请求,用户)
返回重定向('/')
除了不存在:
return HttpResponse('用户不存在')
其他:
表单 = AuthenticationForm()

return render_to_response('accounts/login.html',
{'形式':形式},
context_instance=RequestContext(request))

最佳答案

好吧,看起来最好的行动方案不是将 Django 的用户移交给 Mongo 进行身份验证……通过 Twitter 获得了这个金块:

@blogblimp我的简短回答:尽量避免用 MongoDB 替换 Django 用户模型。你失去了所有的 Django 能力,失去了 MongoDB 的速度。
说真的,用户与一切有关,而 MongoDB 不是关系。— Daniel Roy Greenfeld (@pydanny) January 20, 2014


所以:我将只利用 PostgreSQL 进行身份验证,并利用 Mongo 进行其他对象。这意味着在 Django 设置中命名/连接到两个数据库。回想起来,我想道德是:永远不要仅仅因为 Mongo 很酷就使用它。 Mongo 仍然是 Django 世界中的二等公民。

关于django - MongoEngine——如何为身份验证()自定义用户模型/自定义后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21072595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com