Почему я не могу аутентифицировать других пользователей, кроме суперпользователя в Django? - PullRequest
0 голосов
/ 28 января 2019

Я использовал значение по умолчанию path('',include("django.contrib.auth.urls")) в django для выполнения операций входа в систему, сброса пароля для моего проекта, я тщательно проверил свою форму регистрации и базу данных, все идет хорошо с частью регистрации, но я не могу аутентифицировать вседругие пользователи, кроме суперпользователя, в чем может быть причина этой проблемы?

myproject/urls.py:

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('home/', include('home.urls')),
    path('accounts/',include('accounts.urls')),
    path('',include("django.contrib.auth.urls"))
]

и в шаблонах в каталоге регистрации моя форма входа будет выглядеть как

{% extends 'base.html' %}

{% block title %}Login{% endblock %}

{% block content %}
<h2>Login</h2>
<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Login</button>
</form>
{% endblock %}

мой вид регистрации:

class UserFormView(View):
    form_class = RegForm
    template_name = 'signup.html'

    def get(self, request):
        form = self.form_class()
        return render(request, self.template_name, {'form': form})

    def post(self, request):
        form = self.form_class(request.POST)
        if (form.is_valid()):
            form.save()
            return redirect('login')
        return render(request, self.template_name, {'form': form})

А потом моя форма:

class RegForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())
    confirm_password=forms.CharField(widget=forms.PasswordInput())
    class Meta:
        model= User
        fields=['first_name','last_name','username','email','date_joined','password','confirm_password']
    def clean_password(self):
        password=self.cleaned_data.get("password")
        confirm_password = self.cleaned_data.get("confirm_password")
        if(len(password)<8):
            raise forms.ValidationError("The length of the password should be minimum 8 characters")

        return password
    def clean_email(self):
        email=self.cleaned_data.get('email')
        if(validate_email(email)==False):
            raise forms.ValidationError("The Email Format is In Correct")
        return email
    def clean_confirm_password(self):
        password = self.cleaned_data.get("password")
        confirm_password = self.cleaned_data.get("confirm_password")
        if (password != confirm_password):
            raise forms.ValidationError('Password doesn\'t match')

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Это потому, что вы неправильно сохранили пароль.В django он выполняет хеширование над паролем.Вы можете использовать поле пароля пользователя django (ссылка ссылка https://docs.djangoproject.com/en/2.1/ref/contrib/auth/#django.contrib.auth.models.User.password), чтобы ваша RegForm выглядела как

class RegForm(forms.ModelForm):

    confirm_password=forms.CharField(widget=forms.PasswordInput())
    class Meta:
        model= User
        fields=['first_name','last_name','username','email','date_joined','password','confirm_password']
    def clean_password(self):
        password=self.cleaned_data.get("password")
        confirm_password = self.cleaned_data.get("confirm_password")
        if(len(password)<8):
            raise forms.ValidationError("The length of the password should be minimum 8 characters")

        return password
    def clean_email(self):
        email=self.cleaned_data.get('email')
        if(validate_email(email)==False):
            raise forms.ValidationError("The Email Format is In Correct")
        return email
    def clean_confirm_password(self):
        password = self.cleaned_data.get("password")
        confirm_password = self.cleaned_data.get("confirm_password")
        if (password != confirm_password):
            raise forms.ValidationError('Password doesn\'t match')

или

, чтобы сохранить хэшированное значение входного пароля в методе post.Таким образом, код выглядит как

def post(self, request):
    form = self.form_class(request.POST)
    if (form.is_valid()):
        user_form = form.save(commit=False)
        user_form.set_password(request.POST.get('password'))
        user_form.save()
        return redirect('login')
    return render(request, self.template_name, {'form': form})
0 голосов
/ 28 января 2019

Как я уже говорил в комментариях, вам нужно сохранить пользователя следующим образом:

 def post(self, request):
    form = self.form_class(request.POST)
    if form.is_valid():
        user = form.save(commit=False)
        password = form.cleaned_data['password']
        user.set_password(password)
        user.save()
        return redirect('login')
    return render(request, self.template_name, {'form': form})
0 голосов
/ 28 января 2019

Django ожидает, что поле password модели User содержит хешированный пароль.Ваша форма хранит пароль в виде открытого текста (что является большой защитой, не допускается).

Я предлагаю вам взглянуть на исходный код из django.contrib.auth.forms.UserCreationFormо том, как правильно создать пользователя.

Редактировать: я предполагаю, что вы можете войти в систему с суперпользователем, потому что вы создали его с помощью команды createsuperuser.

...