django 初始数据夹具中的用户

apeeds0o  于 2023-01-27  发布在  Go
关注(0)|答案(6)|浏览(134)

我在我的fixtures/initial_data.json中默认创建了一些用户,以便有一些测试“主题”。我遇到的问题是密码生成。我可以在“字段”中设置密码,但这不会生成散列密码:

[
    { "model": "auth.user",
        "pk": 1,
        "fields": {
            "username": "user1",
            "password": "password"
        }
    }
]

我需要一个生成用户密码的方法,我是否需要像Django那样手动生成一个类似{hash_method}${salt}${hashed_password}的字符串?

bmp9r5qi

bmp9r5qi1#

在这种情况下(如果您只需要几个用户),更简单的方法是通过admin创建一些假用户帐户(包括密码),然后使用 dumpdata 将这些用户转储到fixture文件中:

$ python manage.py dumpdata auth.User --indent 4 > users.json

它将自动为您创建设备,并可在以后与 loaddata 一起使用
(You如果您需要大量的测试用户,可以只创建一个假帐户,然后在其余的fixture中使用散列)
https://docs.djangoproject.com/en/dev/ref/django-admin/#dumpdata-appname-appname-appname-model

ylamdve6

ylamdve62#

好吧,我同意你的回答,但还是让我来回答原来的问题吧。
如何获得“Django会散列的密码“?
让我们看看文件django/contrib/auth/hashers.py

def make_password(password, salt=None, hasher='default'):
    """
    Turn a plain-text password into a hash for database storage

    Same as encode() but generates a new random salt.  If
    password is None or blank then UNUSABLE_PASSWORD will be
    returned which disallows logins.
    """
    # ...

请参见此示例会话:

./manage.py shell

>>> from django.contrib.auth.hashers import make_password, HASHERS
>>> make_password('test')
'pbkdf2_sha256$10000$vkRy7QauoLLj$ry+3xm3YX+YrSXbri8s3EcXDIrx5ceM+xQjtpLdw2oE='

# fix salt:
>>> make_password('test', 'abc')
'pbkdf2_sha256$10000$abc$MqJS5OAgSmf9SD9mfoY8fgLo8sSKmEcef0AjjMp1Q7w='

# use different (maybe faster, maybe unsafe!) hasher

In [12]: HASHERS
Out[12]:
{'bcrypt': <django.contrib.auth.hashers.BCryptPasswordHasher object at 0x29c6d50>,
 'crypt': <django.contrib.auth.hashers.CryptPasswordHasher object at 0x29c6f50>,
 'md5': <django.contrib.auth.hashers.MD5PasswordHasher object at 0x29c6e10>,
 'pbkdf2_sha1': <django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher object at 0x29c6bd0>,
 'pbkdf2_sha256': <django.contrib.auth.hashers.PBKDF2PasswordHasher object at 0x29c6cd0>,
 'sha1': <django.contrib.auth.hashers.SHA1PasswordHasher object at 0x29c6dd0>,
 'unsalted_md5': <django.contrib.auth.hashers.UnsaltedMD5PasswordHasher object at 0x29c6ed0>,
 'unsalted_sha1': <django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher object at 0x29c6e50>}

In [14]: [make_password('test', hasher=name) for name in HASHERS]
Out[14]:
['sha1$LdKsAbJRjlVP$2eb2346387cc510f576f2f11eebdfe18b20d1be1',
 'pbkdf2_sha256$10000$Ck8gtWQJnJ9x$M/OqP548d5KcPqFuVRgXb84unjYbYDH6oyimbDndE3k=',
 'pbkdf2_sha1$10000$BJqRu5OwylVF$hUvMLIzBujt9kPbML/dei1vLiMQ=',
 'crypt$$d9grSeqDhMFek',
 '098f6bcd4621d373cade4e832627b4f6',
 'sha1$$a94a8fe5ccb19ba61c4c0873d391e987982fbbd3',
 'bcrypt$$2a$12$WlJP5zm2lmdJ4g/pSE1xF.d/8w.XRT5mo/vGlkKdglBtzcxKw7XJS',
 'md5$txHYmSYJKhD4$69286d4a1abd348fbddc9df7687e2ed4']

您也可以手动使用hasher的encode方法,但是上面的实用函数以一种更简单的方式涵盖了您。

4sup72z8

4sup72z83#

我在为测试编写fixture时遇到了同样的问题,下面是我在单元测试中处理这个问题的方法。
从管理员创建数据并将其转储到fixture works中,但我不太喜欢依赖于手动操作。
按照之前的步骤创建fixture,然后在setUp方法中,为用户创建set_password

用户_夹具.json

[
    { "model": "auth.user",
        "pk": 1,
        "fields": {
            "username": "user1",
            "password": "password"
        }
    }
]

测试用户.py

def setUp(self):
    self.User = get_user_model()

    # Fix the passwords of fixtures
    for user in self.User.objects.all():
        user.set_password(user.password)
        user.save()

这样,我就可以在fixture中干净地编写密码,并在需要时引用它们,而且只需编辑fixture文件就可以创建更多的fixture。

2lpgd968

2lpgd9684#

除了@GauravButola的答案之外,我还创建了一个自定义管理命令来加载fixture并在一个步骤中修复密码。当不使用测试框架来设置密码时,这很有用。该示例使用的是django 1.11,可能还有更早的版本。
在提供fixture的应用中添加管理命令(这是python3次,所以我省略了init pys):

yourapp/
    models.py
    fixtures/
        initial_data.json
    management/
        commands/
            initdata.py

initdata.py看起来像这样:

from django.core.management import BaseCommand, call_command
from django.contrib.auth.models import User
# from yourapp.models import User # if you have a custom user

class Command(BaseCommand):
    help = "DEV COMMAND: Fill databasse with a set of data for testing purposes"

    def handle(self, *args, **options):
        call_command('loaddata','initial_data')
        # Fix the passwords of fixtures
        for user in User.objects.all():
            user.set_password(user.password)
            user.save()

现在,您可以通过调用以下命令加载initial_data并获得有效密码:

./manage.py initdata
nom7f22z

nom7f22z5#

从数据库转储用户信息:

$ python manage.py dumpdata auth.User --indent 4 > users.json

导入/加载数据特定JSON fixture:

$ python manage.py loaddata users.json
ldxq2e6h

ldxq2e6h6#

很确定你做了。它不应该是那么困难。最简单的方法将是看函数user.set_password我认为它是,并且看他们如何做它。你可能可以从一个python终端调用函数并且然后拷贝它到你的初始数据!

相关问题