From b667e6ff12a226a2ecd4d09aba6c6d7d5a195eb8 Mon Sep 17 00:00:00 2001 From: Aleksandr Andrukhov Date: Tue, 10 Dec 2024 13:52:27 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=90=20Add=20Russian=20translation=20fo?= =?UTF-8?q?r=20`docs/ru/docs/tutorial/security/get-current-user.md`=20(#10?= =?UTF-8?q?594)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tutorial/security/get-current-user.md | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 docs/ru/docs/tutorial/security/get-current-user.md diff --git a/docs/ru/docs/tutorial/security/get-current-user.md b/docs/ru/docs/tutorial/security/get-current-user.md new file mode 100644 index 000000000..05eb290d7 --- /dev/null +++ b/docs/ru/docs/tutorial/security/get-current-user.md @@ -0,0 +1,99 @@ +# Данные текущего пользователя + +В предыдущей главе система безопасности (основанная на системе внедрения зависимостей) передавала *функции, обрабатывающей эндпоинт,* `токен` в виде `строки`: + +{* ../../docs_src/security/tutorial001_an_py39.py hl[12] *} + +Это пока что не слишком нам полезно. Давайте изменим код так, чтобы он возвращал нам данные пользователя, отправившего запрос. + +## Создание модели пользователя + +Сначала создадим Pydantic-модель пользователя. + +Точно так же, как мы использовали Pydantic для объявления тел запросов, мы можем использовать его где угодно: + +{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *} + +## Создание зависимости `get_current_user` + +Давайте создадим зависимость `get_current_user`. + +Помните, что у зависимостей могут быть подзависимости? + +`get_current_user` как раз будет иметь подзависимость `oauth2_scheme`, которую мы создали ранее. + +Аналогично тому, как мы делали это ранее в *обработчике эндпоинта* наша новая зависимость `get_current_user` будет получать `token` в виде `строки` от подзависимости `oauth2_scheme`: + +{* ../../docs_src/security/tutorial002_an_py310.py hl[25] *} + +## Получение данных пользователя + +`get_current_user` будет использовать созданную нами (ненастоящую) служебную функцию, которая принимает токен в виде `строки` и возвращает нашу Pydantic-модель `User`: + +{* ../../docs_src/security/tutorial002_an_py310.py hl[19:22,26:27] *} + +## Внедрение зависимости текущего пользователя + +Теперь мы можем использовать тот же `Depends` с нашей зависимостью `get_current_user` в *функции обрабатывающей эндпоинт*: + +{* ../../docs_src/security/tutorial002_an_py310.py hl[31] *} + +Обратите внимание, что мы объявляем тип переменной `current_user` как Pydantic-модель `User`. + +Это поможет выполнить внутри функции все проверки автозаполнения и типа. + +/// tip | Подсказка +Возможно, вы помните, что тело запроса также объявляется с помощью Pydantic-моделей. + +В этом месте у **FastAPI** не возникнет проблем, потому что вы используете `Depends`. +/// + +/// check | Заметка +То, как устроена эта система зависимостей, позволяет нам иметь различные зависимости, которые возвращают модель `User`. + +Мы не ограничены наличием только одной зависимости, которая может возвращать данные такого типа. +/// + +## Другие модели + +Теперь вы можете получать информацию о текущем пользователе непосредственно в *функции обрабатывающей эндпоинт* и работать с механизмами безопасности на уровне **Внедрения Зависимостей**, используя `Depends`. + +Причем для обеспечения требований безопасности можно использовать любую модель или данные (в данном случае - Pydantic-модель `User`). + +Но вы не ограничены использованием какой-то конкретной моделью данных, классом или типом. + +Вы хотите использовать в модели `id` и `email`, а `username` вам не нужен? Ну разумеется. Воспользуйтесь тем же инструментарием. + +Вам нужны только `строки`? Или только `словари`? Или непосредственно экземпляр модели класса базы данных? Все это работает точно также. + +У вас нет пользователей, которые входят в ваше приложение, а только роботы, боты или другие системы, у которых есть только токен доступа? Опять же, все работает одинаково. + +Просто используйте любую модель, любой класс, любую базу данных, которые нужны для вашего приложения. Система внедрения зависимостей **FastAPI** поможет вам в этом. + +## Размер кода + +Этот пример может показаться многословным. Следует иметь в виду, что в одном файле мы смешиваем безопасность, модели данных, служебные функции и *эндпоинты*. + +Но вот ключевой момент: + +Все, что касается безопасности и внедрения зависимостей, пишется один раз. + +И вы можете сделать его настолько сложным, насколько захотите. И все это будет написано только один раз, в одном месте, со всей своей гибкостью. + +И у вас могут быть тысячи конечных точек (*эндпоинтов*), использующих одну и ту же систему безопасности. + +И все они (или любая их часть по вашему желанию) могут воспользоваться преимуществами повторного использования этих зависимостей или любых других зависимостей, которые вы создадите. + +И все эти тысячи *эндпоинтов* могут составлять всего 3 строки: + +{* ../../docs_src/security/tutorial002_an_py310.py hl[30:32] *} + +## Резюме + +Теперь вы можете получать данные о текущем пользователе непосредственно в своей *функции обработчике эндпоинта*. + +Мы уже на полпути к этому. + +Осталось лишь добавить *эндпоинт* для отправки пользователем/клиентом своих `имени пользователя` и `пароля`. + +Это будет рассмотрено в следующем разделе.