如果用户已经登录,请限制在PasswordResetView中访问Django的reset_password形式

问题描述 投票:1回答:2

[目前,我有一个用户模型,可以根据其会话访问与帐户相关的信息。我正在使用django auth PasswordResetView。如果用户忘记了密码,则使用密码重置表单来重置密码。但是,该django视图在用户已经登录时也可以访问。如何限制用户访问该页面。我找不到该问题的解决方案,因为它是一个抽象的概念,在我的views.py文件中没有任何内容。

这是我的urls.py文件的样子:

from django.contrib import admin
from django.urls import path, include
from django.contrib.auth import views as auth_views
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('', include('mainapp.urls')),
    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_confirm/<uidb64>/<token>', auth_views.PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'), name="password_reset_confirm"),
    path('password_reset_complete/', auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html'), name="password_reset_complete"),
    path('change_password/', auth_views.PasswordChangeView.as_view(template_name='users/change_password.html', success_url="/"), name="password_change"),
    # path('password_change_done/done/', auth_views.PasswordChangeDoneView.as_view(template_name='users/password_change_done.html'), name="password_change_done"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

已登录的用户应该无法访问password_reset_form,因为仅是在忘记密码并且已经登录该用户时,对于用户而言,访问password_reset.html没有任何意义。如何限制访问。任何帮助将不胜感激。

python django django-forms django-views backend
2个回答
1
投票

多种方法;但是,我认为最快的解决方案是编写一个装饰器:

def login_forbidden(function=None):
    actual_decorator = user_passes_test(
        lambda u: u.is_anonymous,
    )
    if function:
        return actual_decorator(function)
    return actual_decorator

并用它来装饰密码重设视图,在这些视图中,您只想限制未经身份验证的用户访问:

path('password_reset/', login_forbidden(auth_views.PasswordResetView.as_view(template_name='users/password_reset.html')), name="password_reset")

或者,您可以覆盖实际视图。


1
投票

如果您确实要修改默认视图,一种选择是将它们子类化并在您的url中使用它们。

在您的意见中(使用UserPassesTestMixin类:]]

UserPassesTestMixin

在您的网址中:

from django.contrib.auth.mixins import UserPassesTestMixin
from django.contrib.auth.views import PasswordResetView

class MyPasswordResetView(UserPassesTestMixin, PasswordResetView):
    template_name = 'users/password_reset.html'

    # https://docs.djangoproject.com/en/2.2/ref/contrib/auth/#django.contrib.auth.models.User.is_anonymous
    def test_func(self):
        return self.request.user.is_anonymous

您应该学习阅读链接的文档以找到答案。它说from .views import MyPasswordResetView ... path( 'password_reset/', MyPasswordResetView.as_view(), name="password_reset"), ...

[...]您可以设置here的任何参数来自定义对未授权用户的处理[...

并且在AccessMixin下,您可以找到重定向未经授权的用户的属性和方法。

© www.soinside.com 2019 - 2024. All rights reserved.