Как настроить аутентификацию в веб-приложениях на Django
Рассмотрим основные способы настройки аутентификации: от входа и регистрации до работы с социальными сетями и кастомными моделями пользователей.
607 открытий4К показов
Во время аутентификации происходит проверка пользователя: учетные данные сопоставляются с теми, что хранятся в системе. Если указана неверная комбинация логина и пароля, доступ к функционалу веб-приложения будет ограничен.
Такой механизм реализован и на сайте Tproger: читатели не могут создавать, комментировать и лайкать посты, пока не пройдут аутентификацию.
Базовая аутентификация в Django
Фреймворк Django выбирают для аутентификации из-за его встроенной, безопасной и гибкой системы управления пользователями. Это готовые инструменты для регистрации, авторизации и настройки прав доступа, включая защиту от основных типов атак, безопасное хранение паролей и управление сессиями. При этом в Django система аутентификации легко настраивается под нужды проекта, подробно документирована и регулярно обновляется.
Установим фреймворк командой pip:
Создадим новый проект:
Создадим новое приложение для работы с аутентификацией:
Django уже содержит встроенную систему аутентификации. Она находится в приложении django.contrib.auth, которое по умолчанию включено в INSTALLED_APPS в файле settings.py.
Добавим приложение в список INSTALLED_APPS:
Добавление и настройка страниц для входа, регистрации и выхода
Используем встроенные формы Django, чтобы настроить аутентификацию. Сначала создадим поля для входа и регистрации в файле forms.py приложения myapp:
Код выше создает две формы: LoginForm
для входа и RegisterForm
для регистрации нового пользователя.
Форма LoginForm содержит два поля: username и password. Поле password отображается как поле ввода пароля с помощью виджета PasswordInput.
Форма RegisterForm наследуется от встроенной формы UserCreationForm и добавляет дополнительное поле email. В классе Meta указываем модель User и поля, которые нужно включить в форму.
Создадим представления для обработки запросов входа, регистрации и выхода. В файле views.py приложения myapp добавим код:
Код выше создает три функции представления: login_view, register_view и logout_view.
Функция login_view обрабатывает запрос входа пользователя. Для POST-запроса создается экземпляр формы LoginForm с переданными данными. Если форма валидна, извлекаются имя, пароль и выполняется аутентификация пользователя с помощью функции authenticate()
. Если пользователь успешно аутентифицирован, выполняется вход login()
, и пользователь перенаправляется на главную. Для GET-запроса, создается пустая форма LoginForm, которая передается в шаблон login.html.
Функция register_view обрабатывает запрос регистрации.
- Если это POST-запрос, создается экземпляр формы RegisterForm с переданными данными.
- Если форма валидна, новый пользователь сохраняется в базе данных с помощью метода save(), и перенаправляется на страницу входа.
- Если это GET-запрос, создается пустая форма RegisterForm, которая передается в шаблон register.html.
Функция logout_view
обрабатывает запрос завершения сессии. Она вызывает функцию logout()
для выхода пользователя, и перенаправляет его на страницу входа.
Создадим шаблоны login.html, register.html и добавим ссылку на выход в шаблоне base.html:
В шаблоне base.html добавляем условие {% if user.is_authenticated %} — оно проверит, авторизован ли пользователь. Если авторизован, отобразится приветствие и ссылка на выход. Если не авторизован, то появятся ссылки на страницы входа и регистрации.
Обновим файл urls.py приложения myapp, чтобы добавить маршруты для новых представлений:
Запустим сервер, чтобы протестировать вход и регистрацию:
Страницы размещаются по адресу http://localhost:8000/login/ и http://localhost:8000/register/ соответственно.
В Django также есть встроенные классы представлений для аутентификации, такие как LoginView и LogoutView. Чтобы использовать их, обновим файл urls.py приложения myapp:
Заменили функцию представления login_view на класс представления LoginView и указали шаблон login.html. Аналогично, заменили функцию представления logout_view на класс представления LogoutView и указали страницу, на которую будет перенаправлен пользователь после выхода (next_page='login').
Управление доступом с помощью авторизации
Один из распространенных способов ограничения доступа — использование декоратора @login_required. Его можно применять к функциям представления, чтобы разрешить доступ только авторизованным пользователям.
Для использования декоратора @login_required обновим файл settings.py и укажем URL-адрес для перенаправления неавторизованных пользователей:
Теперь в файле views.py приложения myapp добавим следующий код:
Код создает функцию представления home_view
, которая отображает главную страницу сайта. Применяем декоратор @login_required к этой функции, чтобы разрешить доступ только авторизованным пользователям.
Создадим шаблон home.html в директории templates приложения myapp:
Добавим путь для главной страницы в файле urls.py приложения myapp:
Если неавторизованный пользователь попытается получить доступ к главной странице, он будет перенаправлен на страницу входа.
В Django есть система разрешений (permissions) для расширенного управления доступом. С их помощью можно определять, какие действия могут выполнять пользователи или группы пользователей.
Создадим группу и назначим ей разрешения. В файле admin.py приложения myapp добавим следующий код:
Создадим функцию представления, которая будет доступна только пользователям с определенным разрешением. В файле views.py приложения myapp добавим код:
Создаем функцию представления special_page_view, которая отображает специальную страницу. Применяем декоратор @permission_required к этой функции и указываем необходимое разрешение myapp.view_special_page. Только пользователи или группы с этим разрешением смогут получить доступ к данной странице.
Создадим шаблон special_page.html в директории templates приложения myapp:
Добавим маршрут для специальной страницы в файле urls.py приложения myapp:
Теперь только пользователи или группы с разрешением myapp.view_special_page смогут получить доступ к специальной странице.
Расширение модели пользователя
Можно создать собственную модель пользователя, наследуя от AbstractUser или AbstractBaseUser.
Давайте ассмотрим создание кастомной модели пользователя с помощью AbstractUser. В файле models.py приложения myapp добавим код:
Создаем класс CustomUser, который наследуется от AbstractUser. Добавляем дополнительные поля phone_number и address к модели пользователя.
Обновим файл settings.py и укажем кастомную модель:
С этого момента система аутентификации будет использовать кастомную модель пользователя вместо встроенной модели User.
Создадим миграции и применим их для обновления базы данных:
Для работы с кастомной моделью нужно обновить формы. В файле forms.py приложения myapp изменим поля регистрации:
Создаем класс CustomUserCreationForm, который наследуется от UserCreationForm. Добавляем поля phone_number и address к форме и указываем кастомную модель CustomUser в классе Meta.
Чтобы система аутентификации приняла изменения, обновим функцию представления register_view в файле views.py:
Меняем форму UserCreationForm на кастомную форму CustomUserCreationForm. Теперь Django работает, используя собственную модель пользователя с дополнительными полями во всем проекте.
Социальная аутентификация
Для реализации входа через сторонние сервисы есть библиотека django-allauth. Она предоставляет готовые решения для интеграции с провайдерами социальной аутентификации.
Установим библиотеку django-allauth:
Добавим django-allauth в список установленных приложений в файле settings.py:
Добавляем приложения django.contrib.sites, allauth и провайдеры социальной аутентификации, которые хотим использовать. В нашем случае это интеграция Google.
Также устанавливаем значение SITE_ID = 1, чтобы указать идентификатор сайта.
Добавим URL-адреса для django-allauth в файле urls.py проекта:
Включаем URL-адреса django-allauth с префиксом accounts/.
Выполним миграции для создания таблиц в базе данных:
После этого можно настраивать провайдеров социальной аутентификации через административный интерфейс Django.
Добавим кнопки для социальной аутентификации на страницу входа. В шаблоне login.html добавим следующий код:
Добавляем ссылки на страницы регистрации через социальные аккаунты, используя URL-адреса socialaccount_signup с указанием провайдера. Теперь пользователи могут войти на сайт, используя свою учетную запись Google.
Безопасность аутентификации
Рекомендации по повышению безопасности аутентификации:
- Настройте SSL/TLS-сертификат для сайта для безопасного соединения между клиентом и сервером. Используйте протокол HTTPS для всех страниц, где есть аутентификации и передача конфиденциальных данных.
- Система на Django работает со встроенной защитой от межсайтовой подделки запросов (CSRF). Убедитесь, что в шаблонах форм используется тег {% csrf_token %}.
- Экранируйте пользовательский ввод перед его выводом на страницах сайта, чтобы защититься от межсайтового скриптинга (XSS). Django автоматически экранирует переменные в шаблонах, но будьте осторожны при явном выводе HTML.
- Для защиты от атак методом перебора (брутфорса) ограничьте количество неудачных попыток входа для каждого пользователя или IP-адреса. Используйте библиотеки django-axes или django-ratelimit, чтобы реализовать ограничения числа попыток входа.
- Никогда не храните пароли в открытом виде — вместо этого используйте хеш-функции. В Django есть встроенные функции для хеширования паролей: django.contrib.auth.hashers.make_password() и django.contrib.auth.hashers.check_password().
- Возможно, стоит реализовать двухфакторную аутентификацию, чтобы повысить безопасность учетных записей. Используйте библиотеки django-two-factor-auth или django-otp для добавления 2FA.
607 открытий4К показов