- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
总结
如何在 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/
我正在使用SQL Server 2008 R2,并且想创建一个触发器。 对于每个添加(仅添加),将像这样更新一列: ABC-CurrentYear-AutoIncrementCode 例子: ABC-
是否可以在显示最终一致性的数据存储中创建/存储用户帐户? 似乎不可能在没有一堆架构复杂性的情况下管理帐户创建,以避免可能发生具有相同 UID(例如电子邮件地址)的两个帐户的情况? 最终一致性存储的用户
您好, 我有一个带有 Identity 的 .NetCore MVC APP并使用 this指导我能够创建自定义用户验证器。 public class UserDomainValidator : IU
这与以下问题相同:HiLo or identity? 我们以本站的数据库为例。 假设该站点具有以下表格: 帖子。 投票。 注释。 使用它的最佳策略是什么: 身份 - 这是更常见的。 或者 HiLo -
我想将 Blazor Server 与 ASP.NET Identity 一起使用。但我需要使用 PostgreSQL 作为用户/角色存储,因为它在 AWS 中。 它不使用 EF,这是我需要的。 我创
我正在开发一个 .NET 应用程序,它可以使用 Graph API 代表用户发送电子邮件。 提示用户对应用程序进行授权;然后使用获取的访问 token 来调用 Graph API。刷新 token 用
我使用 ASP.NET 身份和 ClaimsIdentity 来验证我的用户。当用户通过身份验证时,属性 User.Identity 包含一个 ClaimsIdentity 实例。 但是,在登录请求期
所以我在两台机器上都安装了 CYGWIN。 如果我这样做,它会起作用: ssh -i desktop_rsa root@remoteserver 这需要我输入密码 ssh root@remoteser
我尝试在 mac osx 上的终端中通过 telnet 连接到 TOR 并请求新身份,但它不起作用,我总是收到此错误消息: Trying 127.0.0.1... telnet: connect to
我正在开发一个 .NET 应用程序,它可以使用 Graph API 代表用户发送电子邮件。 提示用户对应用程序进行授权;然后使用获取的访问 token 来调用 Graph API。刷新 token 用
我正在开发一项服务,客户可以在其中注册他们的 webhook URL,我将发送有关已注册 URL 的更新。为了安全起见,我想让客户端(接收方)识别是我(服务器)向他们发送请求。 Facebook和 G
在 Haskell 中,有没有办法测试两个 IORef 是否相同?我正在寻找这样的东西: IORef a -> IORef a -> IO Bool 例如,如果您想可视化由 IORef 组成的图形,这
我是 .NET、MVC 和身份框架的新手。我注意到身份框架允许通过注释保护单个 Controller 操作。 [Authorize] public ActionResult Edit(int? Id)
我有一列具有身份的列,其计数为19546542,我想在删除所有数据后将其重置。我需要类似ms sql中的'dbcc checkident'这样的内容,但在Oracle中 最佳答案 在Oracle 12
这是我用来创建 session 以发送电子邮件的代码: props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enabl
我想了解 [AllowAnonymous] 标签的工作原理。 我有以下方法 [HttpGet] public ActionResult Add() { return View(); } 当我没
在使用沙盒测试环境时,PayPal 身份 token 对某些人显示而不对其他人显示的原因是否有任何原因。 我在英国使用 API,终生无法生成或找到 token 。 我已经遵循协议(protocol)并
我对非常简单的事情有一些疑问:IDENTITY。我尝试在 phpMyAdmin 中创建表: CREATE TABLE IF NOT EXISTS typEventu ( typEventu
习语 #1 和 #5 是 FinnAPL Idiom Library两者具有相同的名称:“Progressive index of (without replacement)”: ((⍴X)⍴⍋⍋X⍳
当我第一次在 TFS 中设置时,我的公司拼错了我的用户名。此后他们将其更改为正确的拼写,但该更改显然未反射(reflect)在 TFS 中。当我尝试 checkin 更改时,出现此错误: 有没有一种方
我是一名优秀的程序员,十分优秀!