Как применить django-two-factor-auth на пользовательской странице входа?

Я использую двухфакторную аутентификацию Django для защиты моего входа в систему администратора. Я ввел обязательный вход в систему OTP для каждого моего администратора. Теперь я хочу реализовать это для своих обычных пользователей. Если какой-либо пользователь активировал два фактора в своей учетной записи, то каждый раз он будет перенаправлен на страницу OTP, например, пользователи с правами администратора, если два фактора не включены, он будет перенаправлять на страницу моей учетной записи. вот мой вид входа:

      def login_view(request):
     username = None
     password = None
     if request.user.is_authenticated:
         return redirect('blog:my-account')
     else:
         if request.method == 'POST':
            username = request.POST.get('username')
            password =request.POST.get('password')

            user = authenticate(request, username=username, password=password)

            if user is not None:
                login(request, user)
                messages.add_message(request, messages.INFO,'Login Sucessfull')
                return redirect('members:user-profile-private')


**urls.py**

 path('login/',views.login_view, name='login'),

Я также хочу знать, как вернуться на страницу входа администратора Django по умолчанию. После реализации django-two-factor-auth моя страница входа в систему администратора выглядит так

есть ли способ изменить дизайн пользовательской HTML-страницы для входа в систему с двухфакторной аутентификацией ???

3 ответа

Просто чтобы показать, как я это исправил в итоге.

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

Поэтому в моей основной папке шаблонов (см .: https://docs.djangoproject.com/en/3.2/topics/templates/) я добавил следующую папку / файл: [templates]/two_factor/_base.html

Этот файл имеет следующее содержимое:

      {% extends "admin/base_site.html" %}

{% block extrahead %}
  <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet" media="screen">
  <script defer src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script defer src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/js/bootstrap.min.js"></script>
{% endblock %}

{% block content %}{% endblock %}

Это в основном просто отсылает шаблон обратно к использованию шаблона администратора Django по умолчанию. Однако, поскольку шаблоны 2FA полагаются на Bootstrap 4 (что является действительно глупым дизайнерским решением, если вы спросите меня), мне пришлось включить соответствующие заголовки.

Ответ @Patrick помог мне загрузить двухфакторные страницы и сохранить URL-адреса сайта администратора, используя базовый шаблон администратора django. Тем не менее, я хотел использовать стиль администрирования django по умолчанию и на страницах 2FA, и у меня были некоторые пользовательские стили в базовом шаблоне администратора django, _base_site.html, который затирался таблицами стилей начальной загрузки.

Это было мое решение:

      {% extends "admin/base_site.html" %}
{% load i18n static %}

{% block extrahead %}
  <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet" media="screen">
  <script defer src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script defer src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/js/bootstrap.min.js"></script>
  <link rel="stylesheet" href="{% block stylesheet %}{% static "admin/css/base.css" %}{% endblock %}">
{% endblock %}

Таблицы стилей CSS располагаются в порядке приоритета, наиболее важные в последнюю очередь. Итак, здесь я снова явно добавляю django admin base.css в качестве последней таблицы стилей, чтобы она имела приоритет над стилем начальной загрузки.

Мне также нужно было обновить свой пользовательский стиль в _base_site.html, чтобы иметь явный приоритет с тегом !important:

      {% block extrastyle %}
<style>
  :root {
  --primary: #204724 !important ;
  --secondary: #164713 !important ;
}

Страница двухфакторной аутентификации -> здесь конкретно упоминается

Обязательно удалите любые другие маршруты входа в систему, иначе двухфакторная аутентификация может быть обойдена. Интерфейс администратора должен быть автоматически исправлен для использования нового метода входа в систему.

Посмотрите, есть ли у вас другие способы входа в систему.

Также здесь упоминается

Если вы хотите принудительно применить двухфакторную аутентификацию в админке и использовать админский сайт по умолчанию (например, потому что сторонние пакеты регистрируются на django.contrib.admin.site), вы можете обезьяно исправить админсайт по умолчанию с помощью этого.

Итак, файл urls.py вашего проекта должен содержать что-то вроде этого

      from django.contrib import admin
from two_factor.admin import AdminSiteOTPRequired

admin.site.__class__ = AdminSiteOTPRequired

urlpatterns = [
    path('admin/', admin.site.urls),
    ...
]

Это должно решить вашу проблему.

Другие вопросы по тегам