Почему мои пароли Django не шифруются? - PullRequest
1 голос
/ 04 августа 2020

Я использую Django, и я добавил представления для создания, обновления и т.д. c. мои пользователи. Я использую пользователей из 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")

Еще одна вещь (это меньшая проблема, но возможно, это актуальная информация) заключается в том, что поле пароля отображается не как поле пароля как таковое, а как обычное текстовое поле.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 04 августа 2020

Единственная проблема, которую я вижу, это то, что пароли не хешируются.

Потому что нигде вы не указываете это. Вы можете переопределить метод form_valid. Если вы используете UserCreationForm [Django -doc] , тогда он автоматически хеширует пароль, а также использует два поля пароля, которые проверяют, совпадают ли пароли, и представляют пароли в поле пароля.

Таким образом, вы можете получить sh его, переопределив 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.<b>set_password(</b>form.cleaned_data['password']<b>)</b>
        super().form_valid(form)

или мы можем использовать UserCreationForm:

from django.contrib.auth.forms import UserCreationForm

class UserCreateView(LoginRequiredMixin, CreateView):
    template_name = 'users/users_form.html'
    model = User
    <b>form_class = UserCreationForm</b>
    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
        <b>fields</b> = (
            'username', 'is_superuser', 'is_staff', 'first_name', 'last_name',
            'email', 'is_active'
        <b>)</b>
        field_classes = {'username': UsernameField}

, а затем используйте эту форму в своем представлении:

# app/views.py

from app.forms import CustomUserCreationForm

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

Однако включение полей is_superuser может оказаться не очень хорошей идеей, поскольку это может привести к эскалации привилегий [wiki ] где обычный пользователь может создать пользователя-администратора (здесь вы ограничиваете его только зарегистрированными пользователями) и, таким образом, в конечном итоге получает больше привилегий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...