Files
DevOpsLab/app/auth/deps.py
Сергей Антропов 1fbf9185a2 feat: добавлена пометка типа операции (Build/Push) в истории сборок Dockerfile
- Добавлена колонка 'Тип' во все таблицы истории сборок
- Для push операций отображается registry вместо платформ
- Сохранение пользователя при создании push лога
- Исправлена ошибка с logger в push_docker_image endpoint
- Улучшено отображение истории сборок с визуальными индикаторами
2026-02-15 22:59:02 +03:00

85 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Зависимости для аутентификации
Автор: Сергей Антропов
Сайт: https://devops.org.ru
"""
from typing import Optional
from fastapi import Depends, HTTPException, status, Request
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from app.auth.security import decode_access_token
security = HTTPBearer(auto_error=False)
async def get_current_user(
request: Request,
credentials: Optional[HTTPAuthorizationCredentials] = Depends(security)
):
"""Получение текущего пользователя из токена (cookie или Authorization header)"""
token = None
# Сначала проверяем, есть ли пользователь в request.state (установлен middleware)
if hasattr(request.state, 'user') and request.state.user:
return {"username": request.state.user}
# Проверяем cookie
if request.cookies and "access_token" in request.cookies:
token = request.cookies.get("access_token")
# Проверяем заголовок Authorization
elif credentials:
token = credentials.credentials
if not token:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Требуется аутентификация"
)
payload = decode_access_token(token)
if payload is None:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Неверный токен аутентификации"
)
username: str = payload.get("sub")
if username is None:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Неверный токен аутентификации"
)
return {"username": username}
# Для простоты пока без реальной БД пользователей
# В будущем можно добавить модель User
async def get_current_user_optional(
request: Request,
credentials: Optional[HTTPAuthorizationCredentials] = Depends(security)
):
"""Опциональное получение пользователя (для публичных страниц)"""
try:
# Сначала проверяем, есть ли пользователь в request.state (установлен middleware)
if hasattr(request.state, 'user') and request.state.user:
return {"username": request.state.user}
# Проверяем cookie
token = None
if request.cookies and "access_token" in request.cookies:
token = request.cookies.get("access_token")
# Проверяем заголовок Authorization
elif credentials:
token = credentials.credentials
if token:
payload = decode_access_token(token)
if payload:
username: str = payload.get("sub")
if username:
return {"username": username}
except:
pass
return None