如果 django 中未对密码进行哈希处理,则对密码进行哈希处理

问题描述 投票:0回答:1

当我尝试使用管理界面为用户创建密码时,密码不会被散列。 所以我在用户模型中添加了这一行

    def save(self, *args, **kwargs):
        self.set_password(self.password)

虽然这解决了问题。 使用

createsuperuser
创建用户时,它将密码保存为哈希值,但是当我尝试登录管理界面时,却显示密码不正确。 我确信这是由于将上面的行添加到代码中引起的。 当我删除该行时,createsuperuser 工作正常,但密码未在管理界面中进行哈希处理,当我添加行时,admin 可以工作,而 createsuperuser 则不能。 如果密码尚未散列,我想对其进行散列。

class CustomUser(AbstractUser):
    role = models.ForeignKey(to=Role, to_field='role', on_delete=models.CASCADE, null=True, blank=True)
    username = models.CharField(max_length=100, unique=True, editable=True, validators=[MinLengthValidator(5)], null=False)
    image = models.ImageField(upload_to='profile_pics/', blank=True)
    password = models.CharField(max_length=128)
    complaint = GenericRelation(Complaint)
    # Specify unique related names for the groups and user_permissions fields
    groups = models.ManyToManyField(
        Group,
        verbose_name=_('groups'),
        blank=True,
        help_text=_(
            'The groups this user belongs to. A user will get all permissions '
            'granted to each of their groups.'
        ),
        related_name='custom_users',  # Change the related name to 'custom_users'
    )

    user_permissions = models.ManyToManyField(
        Permission,
        verbose_name=_('user permissions'),
        blank=True,
        help_text=_('Specific permissions for this user.'),
        related_name='custom_users',  # Change the related name to 'custom_users'
    )

    def __str__(self):
        return f'{self.username}'

    def save(self, *args, **kwargs):
        if self.role_id == 'admin':
            self.is_staff = True

        if self.image:
            img = Image.open(self.image.path)

            if img.height > 300 or img.width > 300:
                output_size = (300, 300)
                img.thumbnail(output_size)
                img.save(self.image.path)
        super().save(*args, **kwargs)
@admin.register(CustomUser)
class CustomUserAdmin(admin.ModelAdmin):
    list_display = ('username', 'password', 'image', 'role')

django hash passwords
1个回答
0
投票

不要在

.save(…)
方法中进行哈希处理:每次您再次保存模型对象时,都会对密码进行哈希处理。由于
createsuperuser
已经对密码进行了哈希处理,因此它会再次对密码进行哈希处理,使其对(第一个)密码毫无用处。需要使用第一个密码的哈希值登录。

Django

User
的默认管理方式的工作方式是插入一个对其进行哈希处理的表单。我们也可以将其插入自定义管理员:

from django.contrib.auth.forms import UserChangeForm, UserCreationForm


class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ('username', 'role', 'image')


class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = CustomUser
        fields = ('username', 'role', 'image')


@admin.register(CustomUser)
class CustomUserAdmin(admin.ModelAdmin):
    list_display = ('username', 'password', 'image', 'role')
    form = CustomUserChangeForm
    add_form = CustomUserCreationForm

这还将确保密码显示为

<input type="password'>
,从而将密码隐藏在屏幕上。

© www.soinside.com 2019 - 2024. All rights reserved.