Как запретить доступ неавторизованным пользователям или показать им соответствующее сообщение, когда они обращаются к URL-адресам django.contrib.auth вручную? - PullRequest
0 голосов
/ 13 февраля 2019

Я создаю приложение для аутентификации пользователей, используя инфраструктуру аутентификации Django.Я использую предоставленные виды, такие как LoginView и другие виды (from django.contrib.auth).Проблема заключается в том, что пользователи (аутентифицированные или анонимные) получают URL-адреса:

path('password_reset/', views.PasswordResetView.as_view(), name='password_reset'),
path('password_reset/done/', views.PasswordResetDoneView.as_view(), name='password_reset_done'),
path('reset/done/', views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),

, когда они видят эти страницы.например, страница, которая подтверждает, что ссылка для сброса пароля была отправлена ​​на их электронную почту.пока пользователь уже вошел в систему, и он не просил сбросить пароль, и на его электронную почту не было отправлено электронное письмо, потому что он никогда не просил сбросить свой пароль.они просто получили доступ к электронному письму, которому была отправлена ​​страница подтверждения 127.0.0.1:8000/account/password_reset/done/.Как запретить им доступ к этим URL-адресам или показать им соответствующее сообщение?

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Вы можете использовать UserPassesTestMixin, который можно импортировать из

из django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin

, затем вы можете наследовать метод, который выхотите переопределить в представлениях, например:

из django.contrib.auth.views.PasswordResetView

после наследования представления вы можете выполнить то, что вы хотите сделатьв тестовой функции

className класса (UserPassesTestMixin, PasswordResetView):

def test_func(self):
    # do your thing
0 голосов
/ 14 февраля 2019

Благодаря ответам я придумал это решение.(вы можете использовать значение was_sent, чтобы решить что угодно).Но так как я новичок и у меня мало опыта, есть серьезные сомнения в практичности этого решения.комментарии приветствуются.(большая часть кода скопирована из исходного кода. добавленные строки помечены #)

class CustomPasswordResetDoneView(PasswordResetDoneView):

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        self.request.session['was_sent'] = False #
        return self.render_to_response(context)

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super().get_context_data(**kwargs)
        context['was_sent'] = self.request.session.get('was_sent', False) #
        return context


class CustomPasswordResetView(PasswordResetView):

    def get(self, request, *args, **kwargs):
        self.request.session.get('was_sent', False) #
        self.request.session['was_sent'] = False #
        return self.render_to_response(self.get_context_data())

    def post(self, request, *args, **kwargs):
        self.request.session['was_sent'] = True #
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super().get_context_data(**kwargs)
        context['was_sent'] = self.request.session['was_sent'] #
        return context
0 голосов
/ 13 февраля 2019

В таких случаях вам нужно сгенерировать уникальный запрос no и отправить его через параметры запроса, например, 127.0.0.1:8000/account/password_reset/done?req_no=XXXXXXXX или просто добавить поле поиска в URL, например,

path('password_reset/done/<int:req_no> or <str:req_no>', views.PasswordResetDoneView.as_view(), name='password_reset_done'),

, теперь вы можете получить запрос no.на самом деле, проверьте, не существует ли такого запроса, если это так, отправьте шаблон для сообщения об успехе, иначе перенаправьте на домашнюю страницу или отправьте 404 или что-нибудь еще,

, чтобы сохранить запрос №.вам следует создать новую модель и после отправки шаблона успеха удалить этот запрос no из базы данных.

...