Как переопределить стандартный ответ Django Two Factor Authorization на успешный вход в систему
Я использую двухфакторную авторизацию Django в моем представлении входа в систему. Я использую менеджер плагинов для регистрации плагина TwoFactorPlugin
, который
Моя проблема заключается в том, что хотя в представлении я возвращаю HttpResponse
, оно всегда возвращает LOGIN_REDIRECT_URL
. Если я удалю LOGIN_REDIRECT_URL
, он всегда будет перенаправлять на accounts/profile/
, который является стандартным url успешного входа в систему для двух факторов.
Можно ли переопределить это, чтобы вернуть HttpResponse представления?
Есть
ли другой способ сделать это (или любое предложение на самом деле)?views.py:
from two_factor.views import LoginView as TwoFactorLoginView
@login_required
def login_success(request):
success_message = f"User logged in successfully."
return HttpResponse(success_message)
class TwoFactor_LoginView(TwoFactorLoginView):
def form_valid(self, form):
response = super().form_valid(form)
# plugin_response is an HttpResponse return from the plugin "two_factor"
plugin_response = PluginManager.perform_action(
"two_factor",
self.request,
email=self.request.user.email,
password=form.cleaned_data.get("password"),
token=self.request.POST.get("token"),
)
# If the plugin action returns an HttpResponse, use it instead
if isinstance(plugin_response, HttpResponse):
return plugin_response
return response
urls.py:
path("login/", TwoFactor_LoginView.as_view(), name="login"),
path("login_success/", login_success, name="login_success"),
settings.py:
LOGIN_URL = "login/"
LOGIN_REDIRECT_URL = "/login_success/"
Я полностью переписал этот код.
В классе django-two-factor-auth пользовательский класс LoginView
имеет метод done
, который в основном перенаправляет на LOGIN_REDIRECT_URL
.
Поэтому я отменил его, добавив метод done
в свой класс, раскрыв ответ, чтобы иметь возможность изменять его по своему усмотрению:
def done(self, form_list, **kwargs):
"""
Login the user and redirect to the desired page.
"""
# Check if remember cookie should be set after login
current_step_data = self.storage.get_step_data(self.steps.current)
remember = bool(current_step_data and current_step_data.get("token-remember") == "on")
login(self.request, self.get_user())
redirect_to = self.get_success_url()
device = getattr(self.get_user(), "otp_device", None)
response = redirect(redirect_to)
if device:
user_verified.send(
sender=__name__, request=self.request, user=self.get_user(), device=device
)
# Set a remember cookie if activated
if getattr(settings, "TWO_FACTOR_REMEMBER_COOKIE_AGE", None) and remember:
# choose a unique cookie key to remember devices for multiple users in the same browser
cookie_key = REMEMBER_COOKIE_PREFIX + str(uuid4())
cookie_value = get_remember_device_cookie(
user=self.get_user(), otp_device_id=device.persistent_id
)
response.set_cookie(
cookie_key,
cookie_value,
max_age=settings.TWO_FACTOR_REMEMBER_COOKIE_AGE,
domain=getattr(settings, "TWO_FACTOR_REMEMBER_COOKIE_DOMAIN", None),
path=getattr(settings, "TWO_FACTOR_REMEMBER_COOKIE_PATH", "/"),
secure=getattr(settings, "TWO_FACTOR_REMEMBER_COOKIE_SECURE", False),
httponly=getattr(settings, "TWO_FACTOR_REMEMBER_COOKIE_HTTPONLY", True),
samesite=getattr(settings, "TWO_FACTOR_REMEMBER_COOKIE_SAMESITE", "Lax"),
)
return response
# If the user does not have a device.
elif OTPRequiredMixin.is_otp_view(self.request.GET.get("next")):
if self.request.GET.get("next"):
self.request.session["next"] = self.get_success_url()
return redirect("two_factor:setup")
return response
Теперь мне оставалось только добавить свой собственный get_success_url в свой TwoFactor_LoginView
класс:
def get_success_url(self):
return reverse("login_success")