首页 > 解决方案 > 为什么我的 Django 密码没有被加密?

问题描述

我正在使用 Django,并添加了视图来创建、更新等我的用户。我正在使用来自 的用户,并且在迁移时from django.contrib.auth.models import User可以成功看到创建的用户。auth_user

我看到的唯一问题是密码没有被散列。我有另一个项目,在其中我可以看到密码被自动散列,据我调查,这是他们在使用默认 Django 用户时应该具有的默认行为,对吗?我对 Django 比较陌生,所以这可能很简单。

我的创建视图如下所示:

class UserCreateView(LoginRequiredMixin, CreateView):
    """
               -----------------------Vista de crear usuarios--------------------------
    """
    template_name = 'users/users_form.html'
    model = User
    fields = ["username", "password", "is_superuser", "is_staff", "first_name", "last_name", "email", "is_active"]
    success_url = reverse_lazy("users:list_users")

另一件事(这不是一个问题,但可能是相关信息)是密码字段在视图中本身不是作为密码字段出现,而是作为常规文本字段出现。

任何帮助将不胜感激。

标签: django

解决方案


我看到的唯一问题是密码没有被散列。

因为你没有在任何地方指定。您可以覆盖该form_valid方法。如果您使用UserCreationForm[Django-doc],那么这会自动对密码进行哈希处理,并且还使用两个密码字段来查看密码是否匹配,并将密码显示为密码字段。

因此,您可以通过覆盖form_valid(…)[Django-doc]来散列它:

class UserCreateView(LoginRequiredMixin, CreateView):
    template_name = 'users/users_form.html'
    model = User
    fields = [
        'username', 'password', 'is_superuser', 'is_staff',
        'first_name', 'last_name', 'email', 'is_active'
    ]
    success_url = reverse_lazy('users:list_users')

    def form_valid(self, form):
        form.instance.set_password(form.cleaned_data['password'])
        super().form_valid(form)

或者我们可以使用 a UserCreationForm

from django.contrib.auth.forms import UserCreationForm

class UserCreateView(LoginRequiredMixin, CreateView):
    template_name = 'users/users_form.html'
    model = User
    form_class = UserCreationForm
    success_url = reverse_lazy('users:list_users')

您可以通过覆盖表单并定义额外字段来包含额外字段:

# app/forms.py

from django.contrib.auth.forms import UserCreationForm, UsernameField
from django.contrib.auth.models import User

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = User
        fields = (
            'username', 'is_superuser', 'is_staff', 'first_name', 'last_name',
            'email', 'is_active'
        )
        field_classes = {'username': UsernameField}

然后在您的视图中使用此表单:

# app/views.py

from app.forms import CustomUserCreationForm

class UserCreateView(LoginRequiredMixin, CreateView):
    template_name = 'users/users_form.html'
    model = User
    form_class = CustomUserCreationForm
    success_url = reverse_lazy('users:list_users')

然而,包含字段可能不是一个好主意is_superuser,因为这可能会导致权限提升[wiki],普通用户可以在其中创建管理员用户(此处您仅将其限制为登录用户),从而最终获得更多权限.


推荐阅读