4.9 KiB
현재 사용자 가져오기
이전 장에서 (의존성 주입 시스템을 기반으로 한) 보안 시스템은 경로 처리 함수에 str로 token을 제공했습니다:
{* ../../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는 하위 의존성 oauth2_scheme로부터 str로 token을 받게 됩니다:
{* ../../docs_src/security/tutorial002_an_py310.py hl[25] *}
사용자 가져오기
get_current_user는 우리가 만든 (가짜) 유틸리티 함수를 사용합니다. 이 함수는 str로 토큰을 받아 Pydantic User 모델을 반환합니다:
{* ../../docs_src/security/tutorial002_an_py310.py hl[19:22,26:27] *}
현재 사용자 주입하기
이제 경로 처리에서 get_current_user와 함께 같은 Depends를 사용할 수 있습니다:
{* ../../docs_src/security/tutorial002_an_py310.py hl[31] *}
current_user의 타입을 Pydantic 모델 User로 선언한다는 점에 주목하세요.
이는 함수 내부에서 자동 완성과 타입 체크에 도움을 줍니다.
/// tip | 팁
요청 본문도 Pydantic 모델로 선언된다는 것을 기억하실지도 모릅니다.
여기서 FastAPI는 Depends를 사용하고 있기 때문에 혼동하지 않습니다.
///
/// check | 확인
이 의존성 시스템이 설계된 방식은 모두 User 모델을 반환하는 서로 다른 의존성(서로 다른 "dependables")을 가질 수 있도록 합니다.
해당 타입의 데이터를 반환할 수 있는 의존성이 하나만 있어야 하는 것으로 제한되지 않습니다.
///
다른 모델
이제 경로 처리 함수에서 현재 사용자를 직접 가져올 수 있으며, Depends를 사용해 의존성 주입 수준에서 보안 메커니즘을 처리할 수 있습니다.
그리고 보안 요구 사항을 위해 어떤 모델이나 데이터든 사용할 수 있습니다(이 경우 Pydantic 모델 User).
하지만 특정 데이터 모델, 클래스 또는 타입만 사용해야 하는 것은 아닙니다.
모델에 id와 email이 있고 username은 없게 하고 싶으신가요? 물론입니다. 같은 도구를 사용할 수 있습니다.
str만 갖고 싶으신가요? 아니면 dict만요? 또는 데이터베이스 클래스 모델 인스턴스를 직접 쓰고 싶으신가요? 모두 같은 방식으로 동작합니다.
애플리케이션에 로그인하는 사용자는 없고, 액세스 토큰만 가진 로봇, 봇 또는 다른 시스템만 있나요? 이것도 마찬가지로 모두 동일하게 동작합니다.
애플리케이션에 필요한 어떤 종류의 모델, 어떤 종류의 클래스, 어떤 종류의 데이터베이스든 사용하세요. FastAPI는 의존성 주입 시스템으로 이를 지원합니다.
코드 크기
이 예시는 장황해 보일 수 있습니다. 동일한 파일에서 보안, 데이터 모델, 유틸리티 함수 및 경로 처리를 섞어서 사용하고 있다는 점을 기억하세요.
하지만 여기 핵심이 있습니다.
보안과 의존성 주입 관련 코드는 한 번만 작성합니다.
그리고 원하는 만큼 복잡하게 만들 수 있습니다. 그럼에도 여전히 한 번만, 한 곳에만 작성하면 됩니다. 유연성을 모두 유지하면서요.
하지만 같은 보안 시스템을 사용해 수천 개의 엔드포인트(경로 처리)를 가질 수 있습니다.
그리고 그들 모두(또는 원하는 일부)는 이러한 의존성 또는 여러분이 생성한 다른 의존성을 재사용하는 이점을 얻을 수 있습니다.
그리고 이 수천 개의 경로 처리는 3줄 정도로도 만들 수 있습니다:
{* ../../docs_src/security/tutorial002_an_py310.py hl[30:32] *}
요약
이제 경로 처리 함수에서 현재 사용자를 직접 가져올 수 있습니다.
우리는 이미 절반은 왔습니다.
사용자/클라이언트가 실제로 username과 password를 보내도록 하는 경로 처리만 추가하면 됩니다.
다음에 이어집니다.