79

ユーザーパスワードからユーザーを作成すると、django-admin暗号化されます。しかし、djangoシェルからユーザーを作成すると、ユーザーパスワードがプレーンテキストで保存されます。例 :

{
    "date_joined": "2013-08-28T04:22:56.322185",
    "email": "",
    "first_name": "",
    "id": 5,
    "is_active": true,
    "is_staff": false,
    "is_superuser": false,
    "last_login": "2013-08-28T04:22:56.322134",
    "last_name": "",
    "password": "pbkdf2_sha256$10000$iGKbck9CED0b$6hWrKYiMPNGKhcfPVGal2YP4LkuP3Qwem+2ydswWACk=",
    "resource_uri": "/api/v1/user/5/",
    "username": "user4"
},
{
    "date_joined": "2013-08-29T01:15:36.414887",
    "email": "test@ophio",
    "first_name": "",
    "id": 6,
    "is_active": true,
    "is_staff": true,
    "is_superuser": true,
    "last_login": "2013-08-29T01:15:36.414807",
    "last_name": "",
    "password": "123test",
    "resource_uri": "/api/v1/user/6/",
    "username": "test3"
} 

シンプルなブログアプリ用のRESTスタイルのAPIを作成しようとしています:ポストリクエストでユーザーを挿入しようとすると[JSONを渡して]パスワードがプレーンテキストとして保存されます。この動作をオーバーライドする方法。

4

7 に答える 7

171

User(...)他の人が示唆しているように、通常の構文でユーザーを作成しないでください。User.objects.create_user()パスワードを適切に設定する を常に使用する必要があります。

user@host> manage.py shell
>>> from django.contrib.auth.models import User
>>> user=User.objects.create_user('foo', password='bar')
>>> user.is_superuser=True
>>> user.is_staff=True
>>> user.save()
于 2013-08-29T07:34:38.597 に答える
3

django 1.9以降を使用している人への回答はfrom django.contrib.auth.models import User非推奨(おそらくそれ以前)ですが、間違いなく1.9までです。

代わりに: bash で:

python manage.py shell

Python シェルでパスワード付きのユーザーを作成するには:

from django.apps import apps
User = apps.get_model('user', 'User')
me = User.objects.create(first_name='john', email='johnsemail@email.com') # other_info='other_info', etc.
me.set_password('WhateverIwant')  # this will be saved hashed and encrypted
me.save()

API から来ている場合は、おそらくフォームをそのまま適用する必要があります。

import json
User = get_model('User')
class UserEditForm(BaseModelForm):
        """This allows for validity checking..."""

        class Meta:
            model = User
            fields = [
                'first_name', 'password', 'last_name',
                'dob', # etc...
            ]
# collect the data from the API:
post_data = request.POST.dict()
data = {
'first_name': post_data['firstName'],
'last_name': post_data['firstName'],
'password': post_data['password'], etc.
}
dudette = User()  # (this is for create if its edit you can get the User by pk with User.objects.get(pk=kwargs.pk))
form = UserEditForm(data, request.FILES, instance=dudette)
if form.is_valid():
    dudette = form.save()
else:
    dudette = {'success': False, 'message': unicode(form.errors)}
return json.dumps(dudette.json())  # assumes you have a json serializer on the model called def json(self):
于 2016-11-01T20:06:30.897 に答える
3

user.set_passworddjango シェルでパスワードを設定するために使用します。user.passwordDjango はパスワードのハッシュを想定しているため、パスワードを直接設定してもうまくいくかどうかさえわかりません。

フィールドにはパスワードは保存されpasswordません。として保存する<algorithm>$<iterations>$<salt>$<hash>ため、パスワードをチェックするときにハッシュを計算して比較します。ユーザーが実際に計算されたパスワードハッシュが<algorithm>$<iterations>$<salt>$<hash>形式になっているパスワードを持っているとは思えません。

ユーザーを作成するために必要なすべての情報を取得した場合はjson、次のことができます。

User.objects.create_user(**data)

渡されたjsonがデータと呼ばれると仮定します。

注: に余分なアイテムまたは不足しているアイテムがある場合、これはエラーをスローしますdata

この動作を本当にオーバーライドしたい場合は、次のことができます

def override_setattr(self,name,value):
    if name == 'password':
        self.set_password(value)
    else:
        super().__setattr__(self,name,value) #or however super should be used for your version

User.__setattr__ = override_setattr

このソリューションはテストしていませんが、うまくいくはずです。自己責任。

于 2013-08-29T06:40:35.830 に答える
-5

django-shell から django ユーザー オブジェクトのパスワードを設定する方法はいくつかあります。

user = User(username="django", password = "secret")
user.save()

これにより、暗号化されたパスワードが保存されます。

user = User(username="django")
user.set_password("secret")
user.save()

これにより、暗号化されたパスワードが保存されます。

しかし、

user = User(username="django")
user.password="secret"
user.save()

これはプレーンテキストのパスワードを保存します。プロパティを直接変更しているため、ハッシュ/暗号化は適用されません。

于 2013-08-29T07:00:07.303 に答える