스토리 뷰 페이지 헤더 z-index 충돌 문제 해결

- 메인 컨테이너 padding-top을 pt-4에서 pt-20으로 증가
- 드롭다운 z-index를 z-[60]으로 설정하여 헤더보다 높은 우선순위 부여
- 스토리 선택 드롭다운이 정상적으로 작동하도록 수정
- 디버깅용 코드 정리
This commit is contained in:
Hyungi Ahn
2025-09-04 10:22:43 +09:00
parent 3ba804276c
commit 43e7466195
11 changed files with 709 additions and 35 deletions

View File

@@ -12,8 +12,8 @@ from ..core.security import verify_token, get_user_id_from_token
from ..models.user import User
# HTTP Bearer 토큰 스키마
security = HTTPBearer()
# HTTP Bearer 토큰 스키마 (선택적)
security = HTTPBearer(auto_error=False)
async def get_current_user(
@@ -94,16 +94,22 @@ async def get_current_user_with_token_param(
db: AsyncSession = Depends(get_db)
) -> User:
"""URL 파라미터 또는 헤더에서 토큰을 가져와서 사용자 인증"""
print(f"🔍 토큰 인증 시작 - URL 파라미터: {_token[:50] if _token else 'None'}...")
print(f"🔍 Authorization 헤더: {credentials.credentials[:50] if credentials else 'None'}...")
token = None
# URL 파라미터에서 토큰 확인
if _token:
token = _token
print("✅ URL 파라미터에서 토큰 사용")
# Authorization 헤더에서 토큰 확인
elif credentials:
token = credentials.credentials
print("✅ Authorization 헤더에서 토큰 사용")
if not token:
print("❌ 토큰이 제공되지 않음")
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="No authentication token provided"
@@ -112,23 +118,27 @@ async def get_current_user_with_token_param(
try:
# 토큰에서 사용자 ID 추출
user_id = get_user_id_from_token(token)
print(f"✅ 토큰에서 사용자 ID 추출: {user_id}")
# 데이터베이스에서 사용자 조회
result = await db.execute(select(User).where(User.id == user_id))
user = result.scalar_one_or_none()
if not user:
print(f"❌ 사용자를 찾을 수 없음: {user_id}")
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="User not found"
)
if not user.is_active:
print(f"❌ 비활성 사용자: {user.email}")
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Inactive user"
)
print(f"✅ 사용자 인증 성공: {user.email}")
return user
except Exception as e:

View File

@@ -516,9 +516,14 @@ async def get_document_pdf(
db: AsyncSession = Depends(get_db)
):
"""문서 PDF 파일 조회"""
print(f"🔍 PDF 요청 - 문서 ID: {document_id}")
print(f"🔍 토큰 파라미터: {_token[:50] if _token else 'None'}...")
print(f"🔍 현재 사용자: {current_user.email if current_user else 'None'}")
try:
doc_uuid = UUID(document_id)
except ValueError:
print(f"❌ 잘못된 문서 ID 형식: {document_id}")
raise HTTPException(status_code=400, detail="Invalid document ID format")
# 문서 조회
@@ -527,10 +532,16 @@ async def get_document_pdf(
document = result.scalar_one_or_none()
if not document:
print(f"❌ 문서를 찾을 수 없음: {document_id}")
raise HTTPException(status_code=404, detail="Document not found")
print(f"📄 문서 정보: {document.title}")
print(f"🔐 문서 권한: is_public={document.is_public}, uploaded_by={document.uploaded_by}")
print(f"👤 사용자 권한: is_admin={current_user.is_admin}, user_id={current_user.id}")
# 권한 확인
if not current_user.is_admin and not document.is_public and document.uploaded_by != current_user.id:
print(f"❌ 접근 권한 없음 - 관리자: {current_user.is_admin}, 공개: {document.is_public}, 소유자: {document.uploaded_by == current_user.id}")
raise HTTPException(status_code=403, detail="Access denied")
# PDF 파일 확인
@@ -562,11 +573,20 @@ async def get_document_pdf(
print(f"📂 디렉토리도 없음: {dir_path}")
raise HTTPException(status_code=404, detail="PDF file not found on disk")
return FileResponse(
# PDF 인라인 표시를 위한 헤더 설정
from fastapi.responses import FileResponse
response = FileResponse(
path=file_path,
media_type='application/pdf',
filename=f"{document.title}.pdf"
)
# 브라우저에서 인라인으로 표시하도록 설정 (다운로드 방지)
response.headers["Content-Disposition"] = f"inline; filename=\"{document.title}.pdf\""
response.headers["X-Frame-Options"] = "SAMEORIGIN" # iframe 허용
return response
@router.get("/{document_id}/search-in-content")