Как применить 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),
...
]
Это должно решить вашу проблему.