当他们手动访问django.contrib.auth的URL时,如何拒绝未授权用户的访问或向他们显示适当的消息?

时间:2019-02-13 11:59:01

标签: django django-templates django-views

我正在使用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/。 如何阻止他们访问这些网址或向他们显示适当的消息?

3 个答案:

答案 0 :(得分:1)

在这种情况下,您需要生成唯一请求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'),

现在您可以获得请求号。在视图中,检查是否存在这样的请求,如果是,则发送模板成功消息,否则重定向到主页或发送404或您喜欢的任何内容,

存储请求号。您应该创建一个新模型,并在发送成功模板后,从数据库中删除该要求。

答案 1 :(得分:0)

您可以使用可以从

导入的UserPassesTestMixin
  

从django.contrib.auth.mixins导入LoginRequiredMixin,UserPassesTestMixin

然后,您可以继承要在视图中覆盖的方法, 例如。

  

来自django.contrib.auth.views.PasswordResetView

继承视图后,您可以在测试功能中执行您想做的事情

Class ClassName(UserPassesTestMixin,PasswordResetView):

def test_func(self):
    # do your thing

答案 2 :(得分:0)

感谢回答,我想出了这个解决方案。 (您可以使用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