質問

続いていますこのチュートリアルがこれらの問題に直面しています。

  1. ユーザーを登録すると、パスワードがハッシュされていないため、そのユーザーにログインすることはできません。 「無効なパスワードフォーマットまたは不明なハッシュアルゴリズム」admin
  2. API
  3. にログインしていない場合は、「API / Accounts」に投稿することも、閲覧可能なAPIの形式を参照することもできません。

    私のコード:

    from django.contrib.auth.models import User
    from rest_framework import serializers
    
    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ('password', 'first_name', 'last_name', 'email')
            write_only_fields = ('password',)
    
        def restore_object(self, attrs, instance=None):
            # call set_password on user object. Without this
            # the password will be stored in plain text.
            user = super(UserSerializer, self).restore_object(attrs, instance)
            user.set_password(attrs['password'])  #somehow not hashing
            return user
    
    .

役に立ちましたか?

解決 4

set_password()がオブジェクトを保存しないので、スーパーが最初に呼び出されたので、オブジェクトは既にRAWパスワードで保存されています。

パスワードを保存するにはpost_save()を使用するだけです。

def post_save(self, obj, created=False):
    """
    On creation, replace the raw password with a hashed version.
    """
    if created:
        obj.set_password(obj.password)
        obj.save()
.

他のヒント

私はDRF 3.0.2で受け入れられた答えを試してみました。パスワードはハッシュされていませんでした。

代わりに、モデルシリアライザのCREATEメソッドをオーバーライドします

    def create(self, validated_data):
        user = User(email=validated_data['email'], username=validated_data['username'])
        user.set_password(validated_data['password'])
        user.save()
        return user
.

POST_SAVE

ではなく、RESTフレームワークを使用してユーザーを作成するとパスワードをハッシュします。

DRF 3.xの別のアプローチ:

from django.contrib.auth import get_user_model
from django.contrib.auth.hashers import make_password

    def create(self, validated_data):    
        if validated_data.get('password'):
            validated_data['password'] = make_password(
                validated_data['password']
            )

        user = get_user_model().objects.create(**validated_data)

        return user
.

私は WSGeorge さんの解決策を構築しました。ブランクのUserオブジェクトが作成されているので、.set_password()

を使用できます。
def create(self, validated_data):
    user = User()
    user.set_password(validated_data['password'])
    validated_data['password'] = user.password
    return super(UserSerializer, self).create(validated_data)
.

彼の答えとは異なり、私は自分自身を救いません。superを呼び出す親クラスに残ります。

Model Sirrazier

の作成作成
def create(self, validated_data):
        if validated_data.get('password'):
            validated_data['password'] = make_password(validated_data['password'])
        return super(UserSerializer, self).create(validated_data)
.

必ずインポートしてください

from django.contrib.auth.hashers import make_password
.

これを解決するためにユーザーに信号を書くことができます。

def create_hash(sender, instance=None, *args, **kwargs):
passwd = instance.password
instance.set_password(passwd)


pre_save.connect(create_hash, sender=User)
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top