首页 > 解决方案 > Django Mongoengine 身份验证

问题描述

我已经设法将 django 2.0 与 mongoengine 连接起来。除了身份验证部分之外,其他一切都运行良好。在我的 settings.py 中,我有以下内容:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    #For Mongo Authentication
    'mongoengine.django.mongo_auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',

]
AUTH_USER_MODEL = 'mongo_auth.MongoUser'
MONGOENGINE_USER_DOCUMENT = 'mongoengine.django.auth.User'

并收到以下错误

core/checks/registry.py", line 73, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/home/user/virtualenvs/project/lib/python3.5/site-packages/django/contrib/auth/checks.py", line 74, in check_user_model
    if isinstance(cls().is_anonymous, MethodType):
AttributeError: 'MongoUser' object has no attribute 'is_anonymous'

从上面的错误中,我看到问题出在 AUTH_MODEL_USER 的声明中。我没有创建任何自定义用户模型,因为我希望能够使用 django.uath 用户模型....我需要了解如何设置它并能够创建用户并让他们登录。我该怎么办??

标签: djangomongoengine

解决方案


我了解使用 Django 作为 ORM 和已经为您预先构建的身份验证的吸引力。我以前使用过 Django,但从未使用过 Mongoengine。我了解 Mongoengine 对 Django 的支持尚未完成。我最近使用 Mongoengine 在 Flask 中完成了一个项目,我建议您制作自己的用户模型。下面是我使用 bcrypt 自动预保存密码加密的示例。您可能需要安装 blinker 库以获得信号支持。

from mongoengine import Document, StringField
from mongoengine import signals // blinker library may need to be installed 
from bcrypt import hashpw, gensalt


class User(Document):
    first_name = StringField(required=True, max_length=50)
    last_name = StringField(required=True, max_length=50)
    username = StringField(unique=True, required=True, max_length=50)
    password = StringField(required=True, min_length=6)

    def to_json(self):
        return {
            "_id": str(self.pk),
            "first_name": self.first_name,
            "last_name": self.last_name,
            "username": self.username,
            "password": self.password
        }

    @classmethod
    def pre_save(cls, sender, document, **kwargs):
        hashed = hashpw(document.password.encode('utf8'), gensalt())
        document.password = hashed.decode('utf8')

signals.pre_save.connect(User.pre_save, sender=User)

我知道你可能会失去 Django 的好处之一,但是在我看来,对用户模型进行这种级别的控制会让事情变得更容易,而不是学习 Django 的做事方式。to_json() 方法当然是可选的,它只是覆盖了 Mongoengine 的 to_json() 并使其更易于阅读。

要验证密码:

bcrypt.checkpw(password.encode('utf-8'), user.password.encode('utf-8'))

推荐阅读