Как ограничить получателя PasswordResetView в Django? - PullRequest
0 голосов
/ 10 июля 2020

Извините, если заголовок этого поста не требует пояснений. Я реализовал простое приложение для ведения блога с использованием Django, в которое я добавил функцию отправки писем для сброса пароля на случай, если пользователи забудут свои учетные данные.

Для ясности предположим, что у меня есть два пользователя, которые уже зарегистрированы: user1 и user2, и их адреса электронной почты: user1@mail.com и user2@mail.com.

Проблема возникает, когда я отправляю свой адрес электронной почты по умолчанию PasswordResetView, который не принадлежат любому из моих пользователей, скажем userX@mail.com. И когда я go и вхожу в этот адрес электронной почты, я действительно вижу, что получил письмо для сброса пароля, которого мне определенно не должно быть.

Итак, мой вопрос: как я могу изменить свой PasswordResetView, чтобы сначала проверить, действительно ли данный адрес электронной почты принадлежит одному из существующих пользователей, и, если нет, выдает ошибку?

Файл urls.py моего проекта:

from django.contrib import admin
from django.contrib.auth import views as auth_views
from django.urls import path, include
from users import views as user_views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path("admin/", admin.site.urls),
    path("blog/", include("blog.urls")),
    path("register/", user_views.register, name="register"),
    path("login/", auth_views.LoginView.as_view(template_name='users/login.html'), name="login"),
    path("logout/", auth_views.LogoutView.as_view(template_name='users/logout.html'), name="logout"),
    path("password-reset/", auth_views.PasswordResetView.as_view(template_name='users/password_reset.html'), name="password_reset"),
    path("password-reset/done/", auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'), name="password_reset_done"),
    path("password-reset-complete/", auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html'), name="password_reset_complete"),
    path("password-reset-confirm/<uidb64>/<token>/", auth_views.PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'), name="password_reset_confirm"),
    path("profile/", user_views.profile, name="profile"),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Мой password_reset.html файл:

{% extends 'blog/base.html' %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="content-section">
        <form method="POST">
            {% csrf_token %}

            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Reset Password</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Request Password Reset</button>
            </div>
        </form>
    </div>
{% endblock content %}

Код, который я использовал для настройки параметров электронной почты в моем settings.py:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = os.environ.get('EMAIL_USER')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASS')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...