q1: 화면별 샘플 데이터를 관리하고, 각 화면별로 권한이 있는 사용자만 데이터를 조회할 수 있는 구조로 FastAPI로 구현한 예제

a1:

화면별 샘플 데이터를 관리하고, 각 화면별로 권한이 있는 사용자만 데이터를 조회할 수 있는 구조로 FastAPI로 구현한 예제입니다. 사용자 권한 검증은 간단한 API 토큰 기반 인증으로 처리합니다.

예제 코드

from fastapi import FastAPI, HTTPException, Depends
from pydantic import BaseModel

app = FastAPI()

# 샘플 데이터 모델
class SampleData(BaseModel):
    id: int
    name: str
    value: str
    screen: str

# 사용자 권한 데이터 (API 토큰과 권한 매핑)
user_permissions = {
    "user1_token": ["screen1", "screen2"],  # user1은 screen1, screen2 접근 가능
    "user2_token": ["screen3"],            # user2는 screen3 접근 가능
    "admin_token": ["screen1", "screen2", "screen3"],  # admin은 모든 화면 접근 가능
}

# 화면별 샘플 데이터
sample_data = [
    {"id": 1, "name": "Sample A", "value": "Data A1", "screen": "screen1"},
    {"id": 2, "name": "Sample B", "value": "Data B1", "screen": "screen1"},
    {"id": 3, "name": "Sample C", "value": "Data C1", "screen": "screen2"},
    {"id": 4, "name": "Sample D", "value": "Data D1", "screen": "screen3"},
    {"id": 5, "name": "Sample E", "value": "Data E1", "screen": "screen3"},
]

# 사용자 인증 및 권한 확인 함수
def get_user_permissions(api_token: str):
    permissions = user_permissions.get(api_token)
    if not permissions:
        raise HTTPException(status_code=401, detail="Unauthorized: Invalid API token")
    return permissions

# 기본 경로
@app.get("/")
def read_root():
    return {"message": "Welcome to the Screen-Specific Sample API"}

# 화면별 샘플 데이터 조회 (권한 확인 포함)
@app.get("/samples/{screen_name}", response_model=list[SampleData])
def get_samples_by_screen(screen_name: str, api_token: str = Depends(get_user_permissions)):
    # 사용자 권한 확인
    if screen_name not in api_token:
        raise HTTPException(status_code=403, detail="Forbidden: Access denied to this screen")
    
    # 해당 화면의 샘플 데이터 반환
    filtered_samples = [s for s in sample_data if s["screen"] == screen_name]
    if not filtered_samples:
        raise HTTPException(status_code=404, detail="No samples found for this screen")
    return filtered_samples

코드 설명
1. 사용자 권한 관리 (user_permissions)
• 사용자별로 접근 가능한 화면 목록을 API 토큰으로 매핑.
• 예: user1_token은 screen1과 screen2의 데이터에만 접근 가능.
2. 사용자 인증 및 권한 확인
• get_user_permissions 함수로 API 토큰을 확인하여 사용자 권한을 반환.
• 권한이 없는 사용자가 접근하려 하면 401 Unauthorized 또는 403 Forbidden 에러 반환.
3. 샘플 데이터 관리
• sample_data 리스트에 각 데이터의 screen 정보를 추가.
• 요청된 화면(screen_name)에 맞는 데이터만 반환.
4. API 경로
• /samples/{screen_name}: 특정 화면에 대한 샘플 데이터를 반환.
• API 토큰을 Depends로 받아 권한을 확인.

실행 방법
1. 코드 저장: main.py
2. FastAPI와 uvicorn 설치:

pip install fastapi uvicorn


3. 터미널에서 실행:

uvicorn main:app --reload

테스트 예제

1. 유효한 토큰으로 화면 데이터 조회

URL: http://127.0.0.1:8000/samples/screen1
Headers:

api_token: user1_token

응답:

[
    {"id": 1, "name": "Sample A", "value": "Data A1", "screen": "screen1"},
    {"id": 2, "name": "Sample B", "value": "Data B1", "screen": "screen1"}
]

2. 권한 없는 사용자

URL: http://127.0.0.1:8000/samples/screen2
Headers:

api_token: user2_token

응답:

{
    "detail": "Forbidden: Access denied to this screen"
}

3. 유효하지 않은 토큰

URL: http://127.0.0.1:8000/samples/screen3
Headers:

api_token: invalid_token

응답:

{
    "detail": "Unauthorized: Invalid API token"
}

확장 가능성
1. 사용자 관리 시스템 연동
• DB 또는 인증 서버와 연동하여 토큰 검증 및 권한 확인.
2. JWT 토큰 활용
• JSON Web Token(JWT)으로 사용자 인증 구현 가능.
3. 샘플 데이터 동적 관리
• 샘플 데이터를 DB에서 가져오거나 동적으로 생성.

이 구조는 화면별로 사용자 접근을 제한하는 요구사항을 충족하며, 확장성과 보안성을 고려한 설계입니다.

반응형

+ Recent posts