Ограничьте доступ к форме reset_password Django в PasswordResetView, если пользователь уже вошел в систему - PullRequest
2 голосов
/ 16 октября 2019

В настоящее время у меня есть модель пользователя, которая может получать доступ к информации, связанной с учетной записью, на основе своего сеанса. Я использую 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.

Ответы [ 2 ]

2 голосов
/ 16 октября 2019

Несколько способов сделать это;Тем не менее, я думаю, что самым быстрым решением было бы написать декоратор:

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 голос
/ 16 октября 2019

Если вы действительно хотите изменить представления по умолчанию, одним из вариантов будет создание их подкласса и использование их в ваших URL.

В ваших представлениях (используя 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

В ваших URL:

from .views import MyPasswordResetView

...
    path(
        'password_reset/', 
        MyPasswordResetView.as_view(),
        name="password_reset"),
...

Вы должны научиться читать связанные документы, чтобы найти свои ответы. Здесь говорится здесь :

[...] вы можете установить любой из параметров AccessMixin, чтобы настроить обработку неавторизованных пользователей [...]

А в разделе AccessMixin вы можете найти атрибуты и методы для перенаправления неавторизованных пользователей.

...